2012-12-08 39 views
14

Tôi đang cố gắng để có được X-Editable chỉnh sửa nội dòng của một mô hình ở Django. Tôi chỉ đơn giản là cố gắng thay đổi các thuộc tính của một cá thể mô hình (trong trường hợp này, tên của một đối tượng Dataset).Chỉnh sửa nội dòng có thể chỉnh sửa X trong Django - cách nhận bảo vệ CSRF?

Tôi không chắc chắn làm thế nào để viết xem để nó một cách chính xác nắm bắt được thông tin từ yêu cầu ajax:

POST /datasets/9/update_name/ 
{ 
    pk: 3   //primary key (record id) 
    value: 'The Updated Name' //new value 
} 

Sau đó lưu tên mới cho các đối tượng Dataset.

urls.py

# ex: /datasets/3/update_name 
url(r'^(?P<pk>\d+)/update_name/$', update_name , 
    name='update_name'), 

detail.html

<h1 class="page-title center"> 
    <a href="#" id="datasetName">{{ dataset.name }}</a> 
</h1> 
<script> 
$('#datasetName').editable({ 
    type: 'text', 
    pk: {{ dataset.pk }}, 
    url: '{% url 'datasets:update_name' dataset.pk %}', 
    title: 'Edit dataset name' 
    params: { csrf: '{% csrf_token %}'} # // This isn't working 
}); 
</script> 

views.py

def update_name(request, dataset_id): 
    # ... Update Dataset object ... 
    json = simplejson.dumps(request.POST) 
    return HttpResponse(json, mimetype='application/json') 

EDIT:

tôi tin rằng các pro blem là không có bảo vệ CSRF. Làm thế nào tôi có thể thêm điều này trong biểu mẫu có thể chỉnh sửa X?

** EDIT 2:

Tôi cũng đã cố gắng này, theo các tài liệu:

<h1 class="page-title center"> 
    <a href="#" id="datasetName">{{ dataset.name }}</a> 
</h1> 

<script> 
// using jQuery 
function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
    var cookies = document.cookie.split(';'); 
    for (var i = 0; i < cookies.length; i++) { 
     var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) == (name + '=')) { 
      cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
      break; 
      } 
     } 
     } 
     return cookieValue; 
    } 
    var csrftoken = getCookie('csrftoken'); 

    function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
beforeSend: function(xhr, settings) { 
    function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
     var cookie = jQuery.trim(cookies[i]); 
        // Does this cookie string begin with the name we want? 
        if (cookie.substring(0, name.length + 1) == (name + '=')) { 
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
        break; 
        } 
       } 
       } 
       return cookieValue; 
      } 
      if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) { 
      // Only send the token to relative URLs i.e. locally. 
      xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken')); 
     } 
     } 
    }); 
$('#datasetName').editable({ 
    type: 'text', 
    pk: {{ dataset.pk }}, 
    url: '{% url 'datasets:update_name' dataset.pk %}', 
    title: 'Edit dataset name', 
}); 
</script> 
+0

Cảm ơn bạn đã chia sẻ những gì bạn đang làm, nhưng câu hỏi là gì? –

+0

Xin lỗi. Đã chỉnh sửa. Tôi chỉ không chắc cách viết chế độ xem để nắm bắt và lưu thông tin từ yêu cầu –

+1

Mã xem có được gọi không? Request.POST trông như thế nào? 'Request.is_ajax()' có đúng không? Bạn có nhận được phản hồi thành công trong giao diện người dùng không? Kết quả của 'form.is_valid()' là gì? – dokkaebi

Trả lời

4

Tên chính xác cho trường mẫu CSRF là csrfmiddlewaretoken.

+0

câu trả lời đơn giản đẹp – danihp

21

Chà, tôi đã dành rất nhiều thời gian cho vấn đề này!

Phiên bản danh sách rút gọn sẽ là:

<a href="#" id="projectname{{project.id}}" data-type="text" data-pk="{{project.id}}" data-title="Enter project name" data-url="{% url 'updateproject' project.id %}" data-params="{csrfmiddlewaretoken:'{{csrf_token}}'}">{{ project.name }}</a> 

Và sau đó, hãy gọi

$('#projectname{{project.id}}').editable(); 
+1

Cảm ơn bạn ! Tôi đã có cùng một vấn đề! – CamelBlues

+1

Cảm ơn bạn :) Và với những người tuyệt vời tại x-editable –

1

tôi phải đối mặt với điều này trong dự án PHP của tôi và tôi giải quyết nó bằng cách sử dụng tùy chọn ajaxOptions. Chọn Mã thông báo CSRF từ thẻ meta và thêm nó vào tiêu đề yêu cầu.

ajaxOptions: { 
    dataType: 'json', 
    beforeSend: function(xhr){ 
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]') 
     .attr('content')); 
    }   
} 
Các vấn đề liên quan