我想通過AJAX(只是JS,沒有jQuery)上傳HTML表單。表單由我的模板通過添加三個組件組裝而成:csrf標記,ModelForm和常規Django表單(forms.Form)。模型表單{{form.as_p}}包含表單的可見部分,而{{order_form}}表單包含一些隱藏的字段。我的模板的形式部分看起來是這樣的:Django後端FormData()對象總是空
<form id="{{ form_id }}" action="javascript:submitThisForm('{{ form_id }}', '/submit_blog_entry/')" method='POST' enctype='multipart/form-data'>
{% csrf_token %}
{{ form.as_p }}
{{ other_form }}
<input type='submit' value='SAVE changes' />
</form>
我已經嘗試從<form>
標籤刪除加密類型(我在另一個問題的答覆讀取FORMDATA()自動將此),但無濟於事。
當按下submit按鈕時,調用JS函數submitBlodEntryForm(),傳遞表單ID和url以用於AJAX請求。該JS功能的代碼在這裏:
function submitThisForm(form_ID, url){
var submit_form = document.getElementById(form_ID);
var formData = new FormData(document.getElementById(form_ID));
httpRequest = new XMLHttpRequest();
if (!httpRequest){
alert("Giving up, cannot create an XMLHTTP instance.");
return false;
};
var url = "/submit_blog_entry/";
var sendCSRFtoken = "csrfmiddlewaretoken="+String(getCookie('csrftoken'));
var sendContent = sendCSRFtoken+"&"+formData;
httpRequest.onreadystatechange = alertContents;
httpRequest.open('POST', url, true);
httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//httpRequest.send();
httpRequest.send(sendContent);
// alternatively: httpRequest.send(formData);
}
AJAX請求被提交給服務器並且被服務器接收(一個Django視圖)。如果我沒有手動添加上面的JS代碼(變量sendContent)中顯示的csrf標記並只發送formData,我會得到一個403錯誤,顯然是因爲服務器找不到標記。它應該是這樣的形式,雖然部分...
當我接收到的數據綁定到相應的表單,驗證失敗:
form = ThisForm(request.POST)
if form.is_valid():
#do something
如果我打印的內容是在request.POST,我在終端中獲得以下內容:
<QueryDict: {'[object FormData]': [''], 'csrfmiddlewaretoken': ['token goes here']}>
顯然,FormData對象是空的。我還以爲這是因爲我得到兩個必填字段以下兩個錯誤在我的形式(通過使用form.errors.as_data()):
[ValidationError(['This field is required.'])]
到底哪裏出問題了?我搞亂了模板,FormData()不生成有用的數據嗎?我錯誤地創建了AJAX請求嗎?或者是服務器端的問題(儘管目前我幾乎沒有做任何事情)?
謝謝任何幫助,非常感謝!
謝謝。我也嘗試過,現在再次按照您的代碼片段中的建議。也不起作用。即使我創建一個空的FormData()對象而不傳遞一個表單並添加它,csrf標記也不會通過(403錯誤再次出現)。 –