2017-02-28 34 views
1

我有一個HTML格式如:的JavaScript後Django的形式給出了CSRF錯誤

<form id="comment" action="{% url "url_name" ur.id %}" method="post">{% csrf_token %} 
    <textarea required="required" maxlength="255" rows="4" class="form-control" name="comment"> 
    </textarea> 
    <button class="btn btn-default" onclick="add_comment(event)">Comment</button> 
</form> 

這是一個HTML表單,而不是django's形式。

這裏我在表格中包含了csrf token。我已經發布這個表單的JavaScript,現在它給了我csrf verification failed錯誤。

缺少什麼我在這裏?從django的表單類創建表單以使用csrf標記是否是強制性的?

需要幫助

我的JS是這樣的:

function add_comment(event) { 
    event.preventDefault() 

    var form = document.getElementById('comment') 

    var url = form.action 
    var method = form.method 

    var form_data = new FormData(form) 

    fetch(url, {method: method, body: form_data}) 

} 

,我只是從我的Django視圖

當我看到需求網絡,CSRF標記和註釋爲通過渲染模板請求有效載荷..

+1

給我們你的JavaScript代碼,並且視角.. –

+0

@SancaKembang我已經更新了問題 – aryan

+0

你有這個問題涉及CSRF令牌不被作爲表單提交的一部分傳遞。我並不太熟悉抓取​​,因爲我一直使用AJAX,但這是你出錯的地方。對不起,我無法提供更多幫助。 – tdsymonds

回答

2

發現這GitHub issue表明,你必須包括憑據,以便CSRF cookie隨請求一起發送。

fetch(url, {method: method, body: form_data, credentials: 'include'}) 
+0

感謝男人......工作得像魅力:) – aryan

0

我假設你使用AJAX發佈表單。當使用AJAX Django的發佈形式,你需要提交AJAX請求之前添加以下到您的Javascript:

$.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')); 
     } 
    } 
}); 

更多信息,可以在https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

相關問題