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>
Cảm ơn bạn đã chia sẻ những gì bạn đang làm, nhưng câu hỏi là gì? –
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 –
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