布尔值的Django表单验证不起作用

时间:2018-08-20 18:36:53

标签: django forms

我有一个简单的HTML表单,正在尝试使用Django表单进行验证。问题在于,Django的表单验证将仅识别is_kit的值'True'。 (当它为'False'时,将显示一条错误消息,指出必须填写该字段。格式如下:

<form method="post"> {% csrf_token %}
    <input type="hidden" name="part_id" value="{{ part.id }}" />
    <input type="hidden" name="is_kit" value="False" />
    <input type="submit" class="btn btn-link" value="Add to Cart"/>
</form>

这是Django表单:

class AddItemToCartForm(forms.Form):
    part_id = forms.IntegerField()
    is_kit = forms.BooleanField()

这是我观点的相关部分:

def post(self, request, id):
    print(request.POST)
    print(request.POST.get('is_kit'))
    form = AddItemToCartForm(request.POST)
    print(form.errors)

服务器提供的输出在这里:

<QueryDict: {'is_kit': ['False'], 'part_id': ['1'], 'csrfmiddlewaretoken': ['X2vkpwG6GJmK79vypFPAveTzVkrxBauJWgfnRvAtJVcZ8NwBokjQhCnfGN9dFFYF']}>
False
<ul class="errorlist"><li>is_kit<ul class="errorlist"><li>This field is required.</li></ul></li></ul>

我认为我的模板应该可以工作,因为查看the source codeforms.BooleanField会将POST数据中的字符串'False'转换为python False值。

如上所述,如果is_kit设置为'True',则表单可以完美验证。

2 个答案:

答案 0 :(得分:1)

From the doc

  

由于默认情况下所有Field子类都具有 required=True ,因此此处的验证条件很重要。如果要在表单中包含布尔值,可以是TrueFalse(例如,选中或未选中的复选框),则必须记住传递 required=False BooleanField 时创建strong>。



因此,在 required=False 中将 BooleanField() 添加为

class AddItemToCartForm(forms.Form):
    part_id = forms.IntegerField()
    is_kit = forms.BooleanField(required=False)


其他信息
如果未选中此复选框,则浏览器不会在请求的POST参数中发送该字段。如果不指定该字段为可选字段,则Django将不在POST参数中时将其视为缺少的字段。

参考SO Post

答案 1 :(得分:0)

您需要将required=False添加到您的BooleanField

class AddItemToCartForm(forms.Form):
    part_id = forms.IntegerField()
    is_kit = forms.BooleanField(required=False)
相关问题