gpt4 book ai didi

django ModelForm 似乎没有验证 BooleanField

转载 作者:行者123 更新时间:2023-12-03 20:37:19 25 4
gpt4 key购买 nike

我正在使用 Django 1.5.4

这是我面临的问题的一个最小示例。

该模型:

#models.py
from django.db import models

class SampleModel(models.Model):
spam = models.BooleanField()

表格:
#forms.py
from django.forms import ModelForm
from .models import SampleModel

class SampleModelForm(ModelForm):
class Meta:
model = SampleModel
fields = ('spam', )

从 Django shell :
>>> data = {} #intentionally blank
>>> form = SampleModelForm(data)
>>> is_valid = form.is_valid() #is_valid is True
>>> form.save() # model instance is created with "spam" set to False by default.

我是否错误地验证了表单? form.is_valid正确验证其他类型的字段。
docs表示默认情况下所有字段都是必需的,但 is_valid返回 True不存在 bool 字段键。

我需要确保输入数据中存在 bool 字段。
截至目前,我正在手动检查该字段是否存在且类型为 bool .你认为我应该覆盖 form.is_valid吗?并添加此检查以便它也可以用于其他模型?

最佳答案

事实证明(来自代码检查;文档没有说)该模型 BooleanField s 有 blank=True在他们的 __init__ 中自动设置方法,从而不需要自动创建的模型表单字段。考虑到这一点,这是有道理的(False 算作空白,所以 BooleanField 需要它为真),但是当您只是阅读文档时,这并不明显。

如果您希望它被要求为 True ,通常的表单字段覆盖适用 - 自己声明该字段或设置其 required属性为 True在验证之前的某个地方(我通常使用表单的 __init__ 方法)。如果您希望它允许 TrueFalse但不是 Python None ,更难了。

具体来说,BooleanField 的标准小部件是一个复选框。浏览器不会为未选中的复选框提交任何内容,因此复选框小部件将提交中缺少该字段视为 False .没有办法将用户没有选择复选框与输入确实不好的情况区分开来。您可以使用不同的小部件(例如, RadioSelect )至少使浏览器可以为 False 提交一些内容。 ,但您仍然遇到 BooleanField 的问题的 to_python方法将其值转换为 boolean在验证之前,所以你必须子类化和覆盖。

幸运的是,False验证代码不会将其视为空,因此如果您这样做,您将能够设置 required=True并且不需要自定义清洁方法。

关于django ModelForm 似乎没有验证 BooleanField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19328302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com