2012-12-08 47 views
14

Django'da bir modelin X-Editable satır içi düzenlemesini yapmaya çalışıyorum. Model örneğinin niteliklerini değiştirmeye çalışıyorum (bu durumda, bir Dataset nesnesinin adı).Django'da X düzenlenebilir satır içi düzenleme - CSRF koruması nasıl alınır?

Ben doğru ajax isteğinden bilgileri yakalar ve böylece görünümü yazmayı değil eminim:

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

Sonra Veri kümesi nesnesine yeni adı kaydedin.

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

DÜZENLEME:

Ben yanlısı inanıyorum blem, CSRF koruması olmamasıdır. Bunu X düzenlenebilir formuna nasıl ekleyebilirim?

** DÜZENLEME 2: Ben de dokümanlar göre, bu denedi

:

<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

Yaptığınız şeyi paylaştığınız için teşekkürler, ancak soru nedir? –

+0

Üzgünüm. Düzenlenen. Bilginin yakalanması ve kaydedilmesi için görünümü nasıl yazacağımdan emin değilim –

+1

Görünüm kodu aranıyor mu? Request.POST nasıl görünür? Request.is_ajax() 'dır? Başarı tepkisi ön uçta mı? Form.is_valid() 'nin sonucu nedir? – dokkaebi

cevap

4

csrf form alanı için doğru ad csrfmiddlewaretoken olduğunu.

+0

güzel basit yanıt – danihp

21

Vay, bu konuda çok zaman harcadım!

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

Ve sonra, benim PHP Projesi'nde bu karşılaştığı ve ben ajaxOptions seçeneğini kullanarak bunu çözmüş

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

Teşekkür ederim ! Aynı problemi yaşıyordum! – CamelBlues

+1

Teşekkür ederim de :) Ve x-düzenlenebilir harika adamlara –

1

çağırır:

kısa liste versiyonu olacaktır. CSRF Jetonunu meta etiketinden aldım ve istek başlığına ekledim.

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