这里是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}},如何实现呢?
答案 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,则可能需要考虑创建自己的表单字段类。