Django 1.6请求POST / GET为空

时间:2014-08-21 06:13:16

标签: django django-forms

我使用基于函数的视图并尝试验证通过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 *函数,这真的很奇怪。

更改为使用datainitial也不会有任何帮助:

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

1 个答案:

答案 0 :(得分:4)

GET和POST仅包含表单数据。它们对您来说是空的,因为您的内容类型是' application / json'。我不清楚为什么你使用这种内容类型,因为有效载荷看起来像是形成编码数据给我,而不是json。

如果手动解析有效负载,请使用data参数。 initial参数仅用于显示初始值。如果您不将表单绑定到数据,则表单是未绑定的,并且永远不会有效。

我不确定为什么以下这行不起作用。 parse_qs(request.body)的价值是多少?

form = CodeCheckForm(parse_qs(request.body))