2012-12-08 49 views
14

我试图在Django中对X-Editable模型进行内联编辑。我只是试图改变模型实例的属性(在这种情况下,数据集对象的名称)。Django中X可编辑的内联编辑 - 如何获得CSRF保护?

我不知道如何写视图,以便它正确地从Ajax请求捕获信息:

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

然后新的名称保存到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') 

编辑:

我相信亲瑕疵是没有CSRF保护。我怎样才能在X-editable表单中添加这个?

**编辑2:

我也试过,按照文档:

<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

感谢您分享您在做什么,但是问题是什么? –

+0

对不起。编辑。我只是不确定如何编写视图来捕获并保存请求中的信息 –

+1

视图代码是否被调用? request.POST是什么样的? 'request.is_ajax()'是真的吗?你会在前端获得成功吗? 'form.is_valid()'的结果是什么? – dokkaebi

回答

4

的CSRF表单字段的正确名称为csrfmiddlewaretoken

+0

很好的简单回答 – danihp

21

哇,我花了这么多时间在这个问题上!

的名单版本是:

<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> 

,然后调用

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

谢谢!我遇到了同样的问题! – CamelBlues

+1

谢谢你:)以及在x-editable的美妙家伙 –

1

我在PHP项目面临这和我使用ajaxOptions选项解决它。从元标记中提取CSRF标记并将其添加到请求标头中。

ajaxOptions: { 
    dataType: 'json', 
    beforeSend: function(xhr){ 
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]') 
     .attr('content')); 
    }   
}