2016-05-04 66 views
3

我知道類似這樣的問題已經被問到之前我無法爲使用這些答案的問題得出可行的解決方案。django中的動態形式的csrf標記錯誤

我有一個頁面,它有一個表格A和很多複選框。表單和相關的複選框是通過Django模板創建的。我通過Django Template創建的表單A的輸入值創建了一個新的表單B.由於csrf_token錯誤,Django不接受我的新表單B.有人可以告訴我如何從django呈現的表單A中提取csrf標記並將其用作動態創建的javascript表單的csrf標記?

+0

你是否發佈從生成的表單'b' t收集的數據o形成'a'的動作,所以django認爲它是'a'的形式? – fips

+0

不,我正在創造一種全新的形式,並且全然不顧舊形式。 –

+0

確定如此除了所有輸入字段之外,還可以在發佈之前將csrf標記隱藏字段添加到新表單中嗎? – fips

回答

1

我認爲一個更簡單的方法是使用cookie。 csrf標記只是一個可以檢索其值的cookie。請參閱Ajax上的部分,看看它是否可以提供任何幫助https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax

var csrftoken = Cookies.get('csrftoken');

做的是使用JavaScript庫的cookie應該理想地幫助你找回CSRF令牌。

+0

如何將cookie添加到動態生成的表單中以便django接受它? –

+0

@Jack_of_All_Trades生成表單後,你是否將其作爲ajax POST請求或正常表單提交 – peckuliarYak

+0

是否有本地js來解決這個問題?我想盡可能避免額外的js庫。 –

3

您可以在發佈的數據中包含csrf標記。

您可以從隱藏字段在HTML表單中提取出來:

<input type="hidden" name="csrfmiddlewaretoken" value="IxwFarTrerVBZbVDX0elVHUEbh0YH58j"> 

使用jQuery選擇:

var token = $('input[name="csrfmiddlewaretoken"]').val(); 

或者如果你喜歡簡單的JS,你所提到的,你可以使用這個函數從文檔中提取它的cookies:

function getCookie(name) { 
    var v = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)'); 
    return v ? v[2] : null; 
} 

var token = getCookie('csrftoken');