我想通过AJAX(只是JS,没有jQuery)上传HTML表单。表单由我的模板通过添加三个组件组装而成:csrf标记,ModelForm和常规Django表单(forms.Form)。模型表单{{form.as_p}}包含表单的可见部分,而{{order_form}}表单包含一些隐藏的字段。我的模板的形式部分看起来是这样的:Django后端FormData()对象总是空
{% csrf_token %}
{{ form.as_p }}
{{ other_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,我在终端中获得以下内容:
显然,FormData对象是空的。我还以为这是因为我得到两个必填字段以下两个错误在我的形式(通过使用form.errors.as_data()):
[ValidationError(['This field is required.'])]
到底哪里出问题了?我搞乱了模板,FormData()不生成有用的数据吗?我错误地创建了AJAX请求吗?或者是服务器端的问题(尽管目前我几乎没有做任何事情)?
谢谢任何帮助,非常感谢!
2016-04-03
S. Ju.