【问题标题】:Django Form Validation for Boolean Values Not Working布尔值的 Django 表单验证不起作用
【发布时间】:2019-01-26 22:26:18
【问题描述】:

我有一个简单的 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',表单将完美验证。

【问题讨论】:

    标签: django forms


    【解决方案1】:

    From the doc,

    由于所有Field子类默认都有required=True,这里的验证条件很重要。如果您想在表单中包含一个布尔值,可以是 TrueFalse(例如选中或未选中的复选框),您必须记住在创建 required=False 时传入 required=False强>BooleanField



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

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


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

    参考SO Post

    【讨论】:

    • 这对我有用,但我觉得我有点困惑。不要求它只是意味着is_kit 的帖子数据中应该存在一个值,True 还是 False?在这种情况下,required=True 似乎实际上是在说 BooleanField 的值必须评估为 True
    • 啊,现在说得通了。谢谢!
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 2018-01-23
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      相关资源
      最近更新 更多