我得到了一些good advice on StackOverflow關於如何使用JavaScript刪除所有隱藏的字段。刪除隱藏字段後Django中的CSRF錯誤
提交表單會將用戶發送到/submit
,調用submit_form
視圖。在我的views.py文件,我定義我的索引頁(與表),並接收提交的頁面(對我來說我/index
頁打印錯誤,但這不應該影響任何東西):
def index(request, error_message = ''):
t = get_template('index.html')
html = t.render(Context({ 'ERROR_MESSAGE': error_message }))
return HttpResponse(html)
def submit_form(request):
# get the POST data out of request and do something
pass
我已經能夠通過將代碼更改爲:
from django.contrib.csrf.middleware import csrf_exempt
@csrf_exempt
def submit_form(request):
# get the POST data out of request and do something
pass
這基本上關閉了submitForm函數的CSRF。但是,我相信這不是理想的解決方案(現在我不檢查我的表單中的僞造)。
我想更復雜的修復,像
- 添加this code到緊跟在jQuery代碼(從提交刪除隱藏字段)
init:function(){
var ac=this
# advice from StackOverflow to remove hidden
# fields from POST submission
jQuery(document).ready(function($){
$("form").submit(function() {
$(this).find(":hidden").remove();
});
# AJAX CSRF code inserted here
#...
}
- Adding `{% csrf_token %}` immediately after my form declaration。我也嘗試向我的`index`視圖添加代碼以將`csrf_token`發送到`index`;這使得令牌在呈現的index.html源代碼中可見(我收集的內容是一個糟糕的主意)。
我見過幾個關於這個問題的問題(和Django書中的參考資料),但沒有看到一個簡單明確的答案。例如,即使我要容忍發佈我的csrf_token
(我仍然知道這是一個糟糕的主意),但是我是否應該在我的索引頁中呈現該內容仍然不清楚(然後它將提交表單將獲得令牌)或者我是否應該在我的submit_form
代碼中執行某些操作。上面鏈接的Django代碼簿使用my_view
作爲渲染令牌的視圖函數;這個名字不是很有幫助!
有沒有人有CSRF工作的小示例(用JavaScript修改窗體)?我真的認爲這對於我和其他人在StackOverflow中看到這一點很有用。理想情況下,它會盡可能地簡單(兩種視圖:一種是交付表格,另一種是印刷內容)
非常感謝您的幫助
更新:。我仍然得到這個錯誤,甚至當我prefent the csrfmiddlewaretoken
被移除。當我*不要做任何JavaScript的處理,我的方式是罰款和我。我已經驗證過,只有我的
有沒有某種方式,CSRF可以看到一些表單元素去掉?我在QueryDict
對象(使用POST從表單發送數據)中找不到任何不同的東西。
我真的很感謝任何幫助!