2012-12-08 5 views
14

Próbuję uzyskać bezpośrednią edycję modelu w Django. Po prostu próbuję zmienić atrybuty instancji modelu (w tym przypadku nazwa obiektu Dataset).Edytowalna edycja w edytorze X w Django - jak uzyskać ochronę CSRF?

nie jestem pewien jak napisać opinię, tak że prawidłowo przechwytuje informacje z żądania ajax:

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

Następnie zapisz nową nazwę dla obiektu 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:

wierzę pro blem jest to, że nie ma żadnej ochrony CSRF. Jak mogę to dodać w formularzu do edycji X?

** EDIT 2:

Próbowałem to również, jak za docs:

<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

Dzięki za podzielenie się tym, co robisz, ale jakie jest pytanie? –

+0

Przepraszamy. Edytowane. Po prostu nie jestem pewien, jak napisać widok do przechwytywania i zapisywania informacji z żądania –

+1

Czy kod widoku jest wywoływana? Jak wygląda request.POST? Czy "request.is_ajax()" jest prawdziwe? Czy otrzymujesz odpowiedź na sukces z przodu? Jaki jest wynik 'form.is_valid()'? – dokkaebi

Odpowiedz

4

Prawidłowa nazwa formularza csrf dziedzinie jest csrfmiddlewaretoken.

+0

miła prosta odpowiedź – danihp

21

Wow, spędziłem tak dużo czasu na ten problem!

Wersja wyboru będzie:

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

A potem zadzwoń

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

Dziękuję ! Miałem ten sam problem! – CamelBlues

+1

Dziękuję również :) I do wspaniałych facetów na x-editable –

1

I wobec tego w moim projekcie PHP i rozwiązać go za pomocą opcji ajaxOptions. Podniósł znacznik CSRF z metatagu i dodał go do nagłówka żądania.

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