2013-07-20 3 views
5

में {% csrf_token%} का उपयोग कैसे करें मेरे उपयोगकर्ता पेज में, मेरे पास AJAX के साथ संपादन किया गया है। और जब मैं संपादन पर क्लिक करता हूं, तो यह ठीक काम करता है। लेकिन जब मैं फॉर्म जमा करता हूं, तो यह कुछ भी नहीं करता है।जावास्क्रिप्ट

CSRF verification failed. Request aborted.

तो, मैं कैसे {% csrf_token%} रखूँ मेरी जावास्क्रिप्ट में: जब मैं जाँच की, यह त्रुटि है? कृपया सलाह दें। धन्यवाद।

edit.js:

function bookmark_edit() { 
    var item = $(this).parent(); 
    var url = item.find(".title").attr("href"); 
    item.load("/save/?ajax&url=" + escape(url), null, function() { 
     $("#save-form").submit(bookmark_save); 
     }); 
    return false; 
    } 

$(document).ready(function() { 
    $("ul.bookmarks .edit").click(bookmark_edit); 
    }); 

function bookmark_save() { 
    var item = $(this).parent(); 
    var data = { 
     url: item.find("#id_url").val(), 
     title: item.find("#id_title").val(), 
     tags: item.find("#id_tags").val() 
     }; 
    $.post("/save/?ajax", data, function (result) { 
     if (result != "failure") { 
     item.before($("li", result).get(0)); 
     item.remove(); 
     $("ul.bookmarks .edit").click(bookmark_edit); 
     } 
     else { 
      alert("Failed to validate bookmark before saving."); 
     } 
     }) 
     return false; 
    } 

save_form.html:

<form id = "save-form" method="post" action="/save/"> 
{% csrf_token %} 
    {{form.as_p}} 
    <input type="submit" value="Save" /> 
</form> 

user_page.html:

{% extends "base.html" %} 
{% block external %} 
    <script type = "text/javascript" src="{% static "assets/js/bookmark_edit.js" %}"></script> 
{% endblock %} 
{% block title %} {{username}} {% endblock %} 
{% block head %} Bookmarks for {{username}} {% endblock %} 
{% block content %} 
    {% include "bookmark_list.html" %} 
{% endblock %} 

view.py:

@login_required(login_url='/login/') 
def bookmark_save_page(request): 
    ajax = request.GET.has_key('ajax') 
    if request.method == 'POST': 
     form = BookmarkSaveForm(request.POST) 
     if form.is_valid(): 
      bookmark = _bookmark_save(request, form) 
      if ajax: 
       variables = RequestContext(request, { 
        'bookmarks':[bookmark], 
        'show_edit':True, 
        'show_tags':True 
        }) 
       return render_to_response('bookmark_list.html', variables) 
      else: 
       return HttpResponseRedirect('/user/%s/' % request.user.username 
        ) 
     else: 
      if ajax: 
       return HttpResponseRedirect('failure') 
    elif request.GET.has_key('url'): 
     url = request.GET['url'] 
     title = '' 
     tags = '' 

     try: 
      link = Link.objects.get(url=url) 
      bookmark = Bookmark.objects.get(
       link=link, 
       user = request.user 
       ) 
      title = bookmark.title 
      tags = ' '.join(
       tag.name for tag in bookmark.tag_set.all() 
       ) 
     except ObjectDoesNotExist: 
      pass 
     form = BookmarkSaveForm({ 
      'url':url, 
      'title':title, 
      'tags':tags 
      }) 
    else: 
     form = BookmarkSaveForm() 

    variables = RequestContext(request, { 
     'form': form 
     }) 
    if ajax: 
     return render_to_response(
      'bookmark_save_form.html', 
      variables 
      ) 
    else: 
     return render_to_response('bookmark_save.html',variables) 

उत्तर

4

आप डेटा की वैधता को सत्यापित करने के लिए POST के लिए सर्वर उत्पन्न csrf_token नहीं भेज रहे हैं। इसलिए त्रुटि।

अनुरोध के data भाग का एक भाग के रूप में आप आप बस कर सकता टोकन

csrfmiddlewaretoken: '{{ csrf_token }}' 

कुछ इस

var data = { 
    url: item.find("#id_url").val(), 
    title: item.find("#id_title").val(), 
    tags: item.find("#id_tags").val(), 
    csrfmiddlewaretoken: '{{ csrf_token }}' 
}; 

की तरह भेजने की जरूरत है या:

var data = $('form').serialize() 

यदि आप संपूर्ण फॉर्म को

के रूप में भेजना चाहते हैं
+0

मैंने कोशिश की 'csrfmiddlewaretoken: '{{csrf_token}}'' लेकिन यह काफी मदद की नहीं किया। और क्या आप समझा सकते हैं कि संपूर्ण शब्दकोश को एक शब्दकोश के रूप में कैसे भेजना है? – Karl

+1

'var data = $ ('form')। Serialize() 'पूरे फॉर्म को एक शब्दकोश के रूप में भेज देगा। – karthikr

+0

धन्यवाद! यह एक काम किया! बीडीडब्ल्यू क्या आप मुझे अद्यतित django संस्करण और जावास्क्रिप्ट दोनों के लिए पढ़ने के लिए कोई अच्छी किताबें सुझा सकते हैं? – Karl

1

मैं यही उपयोग करता हूं। सुनिश्चित नहीं है कि यह आपकी स्थिति में लागू है या नहीं।

// sending a csrftoken with every ajax request 
function csrfSafeMethod(method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
} 
$.ajaxSetup({ 
    crossDomain: false, // obviates need for sameOrigin test 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type)) { 
      xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken')); 
     } 
    } 
}); 
संबंधित मुद्दे