2012-12-08 7 views
14

मैं Django में एक मॉडल के X-Editable इनलाइन संपादन प्राप्त करने की कोशिश कर रहा हूं। मैं बस एक मॉडल उदाहरण के गुणों को बदलने की कोशिश कर रहा हूं (इस मामले में, डेटासेट ऑब्जेक्ट का नाम)।डीजेंगो में एक्स-संपादन योग्य इनलाइन संपादन - सीएसआरएफ सुरक्षा कैसे प्राप्त करें?

मुझे यकीन है कि नहीं है ताकि वह ajax अनुरोध से जानकारी दर्ज करता है कि कैसे दृश्य लिखने के लिए कर रहा हूँ:

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

तो डेटासेट वस्तु के लिए नए नाम को बचाने के।

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

संपादित करें:

मेरा मानना ​​है कि समर्थक ब्लेम यह है कि कोई सीएसआरएफ सुरक्षा नहीं है। मैं इसे एक्स-संपादन योग्य रूप में कैसे जोड़ सकता हूं?

** संपादित करें 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.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

आपको भी धन्यवाद :) और एक्स-संपादन योग्य अद्भुत लोगों के लिए –

1

फोन मैं अपने पीएचपी परियोजना में इस का सामना करना पड़ा और मैं ajaxOptions विकल्प का उपयोग करके इसे हल। मेटा टैग से सीएसआरएफ टोकन उठाया और इसे अनुरोध हेडर में जोड़ा।

ajaxOptions: { 
    dataType: 'json', 
    beforeSend: function(xhr){ 
    xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]') 
     .attr('content')); 
    }   
} 
संबंधित मुद्दे