我使用基于函数的视图并尝试验证通过Ajax提交的表单(使用jquery.form插件):
Content-Type:application/json; charset=UTF-8
X-CSRFToken:jRr4oOBHQS5mtwopN69xHocjWJBYuJHa
X-Requested-With:XMLHttpRequest
请求有效负载:
csrfmiddlewaretoken=jRr4oOBHQS5mtwopN69xHocjWJBYuJHa&code=123456
现在,在view函数中,我有request.GET / POST为空,但request.body为字符串,我无法验证表单。
form = CodeCheckForm(parse_qs(request.body))
form.is_valid()
在第二行中,不会调用clean *函数,这真的很奇怪。
更改为使用data
或initial
也不会有任何帮助:
form = CodeCheckForm(data=parse_qs(request.body))
我做错了什么?
编辑:在答案中,决定性的是改变内容类型。在jquery.forms插件中,我将contentType
选项设置为application/x-www-form-urlencoded; charset=UTF-8
。
编辑2:有两种方法可以围绕标准方式提供任意数据,但在我的情况下它们并不合适:
1)form = MyForm(parse_qs(request.body))
几乎是正确的,但是Django形式期望这是一个QueryDict,并且有一些属性,而这是一个通常的dict。 Form类引发异常并使视图崩溃。
2)form = MyForm(data=parse_qs(request.body))
有效,但不会调用clean*
个函数。这是故意的,因为Django开发人员采用这种方式围绕清洁功能。您应该自己验证数据,然后以这种方式提交。 Django表单不会以任何方式清除它并决定表单未经验证,因此form.is_valid()
将为False
。
答案 0 :(得分:4)
GET和POST仅包含表单数据。它们对您来说是空的,因为您的内容类型是' application / json'。我不清楚为什么你使用这种内容类型,因为有效载荷看起来像是形成编码数据给我,而不是json。
如果手动解析有效负载,请使用data
参数。 initial
参数仅用于显示初始值。如果您不将表单绑定到数据,则表单是未绑定的,并且永远不会有效。
我不确定为什么以下这行不起作用。 parse_qs(request.body)
的价值是多少?
form = CodeCheckForm(parse_qs(request.body))