首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django ModelForm似乎没有验证BooleanField

问django ModelForm似乎没有验证BooleanField
EN

Stack Overflow用户
提问于 2013-10-11 22:35:06
回答 1查看 2.5K关注 0票数 4

我在用django 1.5.4

下面是我所面临问题的一个极小的例子。

模式:

代码语言:javascript
复制
#models.py
from django.db import models

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

表格:

代码语言:javascript
复制
#forms.py
from django.forms import ModelForm
from .models import SampleModel

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

来自django壳:

代码语言:javascript
复制
>>> 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正确地验证了其他类型的字段。文档表示所有字段在默认情况下都是必需的,但是is_valid返回True,而不存在布尔字段键。

我需要确保布尔字段存在于输入数据中。到目前为止,我正在手动检查字段是否存在并且是否属于bool类型。您认为我是否应该重写form.is_valid并添加此检查,以便它也可用于其他模型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-11 22:53:33

结果(通过代码检查,文档没有说)模型BooleanField的__init__方法中自动设置了blank=True,因此不需要自动创建的model字段。这在考虑时是有意义的(假算为空白,因此BooleanField需要它为真),但当您只是阅读文档时,这并不明显。

如果您希望它必须是True,通常的表单字段重写应用--在验证之前自己声明该字段或将其required属性设置为True (我通常使用表单的__init__方法)。如果您想让它允许True或False,而不允许PythonNone,那就更难了。

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

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19328302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档