2014-11-02 109 views
0

我有一個模板(index.html。它擴展base.html)包含一個表單與一個csrf_token極其有效。我使用JS/Ajax將數據發送到我的視圖。所以沒有問題。csrf令牌問題與多個模板

問題是,如果我複製/粘貼我的表單到另一個模板(例如:new.html這也擴展base.html)我得到:CSRF令牌丟失或不正確的錯誤。 (控制檯中的HTTP 403錯誤)

兩個模板都使用相同的JS函數。兩個模板中的表單完全相同。

有什麼建議嗎?

<form method="post" action="." enctype="multipart/form-data"> 
{% csrf_token %} 
    <a href="#" class="heart pull-right" onclick="return Favorite(this)" data="foobar"> 
     <i class="fa fa-heart-o"></i> 
    </a> 
</form> 

這裏JS/Ajax的功能:

function Favorite(item) { 
    song_id = item.getAttribute("data"), 
    $.ajax({ 
     type : "POST", 
     datatype: "json", 
     url: "/fav/", 
     data: { 
      'csrfmiddlewaretoken' : $('input[name=csrfmiddlewaretoken]').val(), 
      song_id : song_id 
     }, 
    }); 
    return false 

順便提及,在index.html中的形式

這裏的形式(index.html中和new.html相同)是在一個div中。在new.html中,表單位於表格中。不知道它是否有幫助。

+0

顯示'new.html'只是一個片段,你正在使用的形式。還有'JS'功能。 – 2014-11-02 18:12:25

+0

你需要更多信息嗎? – 2014-11-02 19:22:43

+0

首先檢查令牌是否被傳遞?在你的JS函數'alert'中,或者寫入'console.log'的時候,'$('input [name = csrfmiddlewaretoken]')。val()'例如'alert($('input [name = csrfmiddlewaretoken]')。val());' – 2014-11-02 20:27:15

回答

0

我終於做到了工作(基於Django的doc和doniyor評論)

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

function Favorite(item) { 
    song_id = item.getAttribute("data-mp3"), 
    csrftoken = getCookie('csrftoken'); 
    $.ajax({ 
    type : "POST", 
    datatype: "json", 
    url: "/fav/", 
    data: { 
     song_id : song_id 
    }, 
    headers: { 
     'X-CSRFToken': csrftoken 
    } 
    }); 
    return false; 
} 
0

首先,如果您使用ajax發送請求,則根本不需要<form>

其次,你可以設置csrf_token也以這樣的方式

... 
data: { 
    csrfmiddlewaretoken: '{{ csrf_token }}', 
    song_id : song_id 
}, 
... 

總是對我的作品。

+0

我刪除了表單並嘗試了您的代碼,但沒有結果:/。我仍然遇到了403問題。 – 2014-11-02 21:14:05

+0

@NabIlovich你使用的是什麼版本的Django? – doniyor 2014-11-02 21:14:28

+0

@NabIlovich只需複製此文件,將其保存爲單獨的js文件,然後將其導入到您的base.html中。 http://pastebin.com/u7vbfDMK – doniyor 2014-11-02 21:15:36