Django的形式应该基于字符串比较返回数据

时间:2018-07-02 07:27:53

标签: python django python-2.7

这里是Django形式,

In [61]: from django import forms

In [62]: class myform(forms.Form):
    ...:     f = forms.BooleanField()
    ...:

In [63]: x = myform({'f': '0'})

In [64]: x.is_valid()
Out[64]: True

In [65]: x.cleaned_data
Out[65]: {'f': True}

我将f传递为'0',cleaned_data将f返回为True。

预期的行为:

表单应返回False的{​​{1}}和'0'的{​​{1}},如何实现呢?

1 个答案:

答案 0 :(得分:2)

默认情况下,forms.BooleanField使用CheckboxInput小部件。提交表单时,未选中的复选框不会发送任何数据,因此CheckboxInput小部件会将任何非空输入视为True

您可以使用RadioSelectInput小部件来解决此问题:

>>> class myform(forms.Form):
...   f = forms.BooleanField(widget=forms.RadioSelect, required=False)
...
>>> x = myform({'f': '0'})
>>> x.is_valid()
True
>>> x.cleaned_data
{'f': False}
>>> x = myform({'f': '1'})
>>> x.is_valid()
True
>>> x.cleaned_data
{'f': True}

请注意,您必须设置required=False,否则表单将无法验证伪造的值。

如果仅使用表单来验证数据而不是呈现HTML,则可能需要考虑创建自己的表单字段类。