2017-03-11 85 views
0

我已經在JavaScript創建的表單元件動態:如何正確添加django csrf_token以形成嵌入式javascript?

var selectform = document.createElement("form")

我已經加入其他輸入元件和這些屬性selectform:

submitnselection.setAttribute('type',"submit"); 
    submitnselection.setAttribute('value',"Submit"); 
    submitnselection.setAttribute("name","submitnpage"); 
    selectform.setAttribute("method", "post") 
    selectform.setAttribute = ("action", "/test") 
    "{% csrf_token %}"; 

在HTML中,加入{% csrf_token %}模板標籤將工作,但在這種情況下,我得到了403禁止的錯誤:

CSRF token missing or incorrect.

我已經找到了一些解決方案,但沒有任何工作對我來說,有沒有什麼方法可以將{% csrf_token %}添加到僅使用Django,Javascript和純Jquery的窗體中?另外請注意,這個腳本是在html裏面的,所以我認爲{% csrf_token %}模板標籤會起作用。

回答

4

這應該工作:

var inputElem = document.createElement('input'); 
inputElem.type = 'hidden'; 
inputElem.name = 'csrfmiddlewaretoken'; 
inputElem.value = '{{ csrf_token }}'; 
selectform.appendChild(inputElem); 

你看,csrf_token無非是一個字符串,它是一種形式的hidden輸入元素的value。就這樣!

+0

你好,感謝您的答案,現在提交按鈕將完全消失,但是當輸入值時,我仍然會得到相同的403錯誤。 – ShellRox

+0

是的。因爲我重寫了提交按鈕。我的錯。更新的答案即將到來... –

+0

它出於某種原因給了我'語法錯誤',同樣發生@ chirilov的解決方案。 – ShellRox

1

你可以試着輸入字段添加到表單:

// declare an input field 
var input = document.createElement('input'); 
input.type = 'hidden'; 
input.name = 'csrfmiddlewaretoken'; 
input.value = '{% csrf_token %}'; 

// attach field to the form 
selectform.appendChild(input); 

// submit 
+0

由於某些原因,'Uncaught SyntaxError:意外的標識符'給了我語法錯誤。 – ShellRox

+0

發現它給我錯誤的價值屬性,但我不知道原因。 – ShellRox

+0

奇怪的是,請訪問findle上的建議代碼:[鏈接](https://jsfiddle.net/derL24xe/),希望這有助於 –

1

如果我明白了一切,你需要發送一個CSRF令牌,但你沒有任何從JavaScript發送到服務器。

從Django模板中的代碼很容易生成帶有通常的{%csrf_token%} Django標籤的csrf標記,但這是因爲模板正在服務器中處理以創建最終的HTML,發送到瀏覽器。

當你使用Javascript時,你不能生成csrf標記,所以我認爲最好的解決方案是在模板中創建一個隱形標記,可能是一個隱藏的輸入。

<input id="token" type="hidden" value="{% csrf_token %}" ></input> 

當jQuery中獲得與值$( '#令牌')ATTR( '值'),我有一個jQuery的POST方法的例子:

token = $('#token').attr('value'); 
$.post(url, { 
      'personId': personId, 
      'csrfmiddlewaretoken': token // This is the important thing 
      }, function() {} 
); 

不管如何你這樣做,你必須發送帶有'csrfmiddlewaretoken'名字和令牌值的令牌以及你想發送給服務器的其他信息。

我正在編輯這個純JS解決方案,如果你需要它。只是說出來。

+0

感謝您的答案,我想我已經找到了這種解決方案,但我試圖如果有的話,找到更類似HTML的簡單易用的解決方案。 – ShellRox