我正在使用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
。你认为我应该覆盖form.is_valid
并添加此检查,以便它也可以重复用于其他模型吗?
答案 0 :(得分:7)
事实证明(来自代码检查;文档没有说明)模型BooleanField
在blank=True
方法中自动设置了__init__
,从而使自动创建的模型形式字段不需要。这在考虑时是有意义的(虚假计数为空白,因此BooleanField
需要它是真的)但是当你阅读文档时它并不明显。
如果您希望将其设置为True
,则应用通常的表单字段覆盖 - 自己声明字段或在验证之前将其required
属性设置为True
(I通常使用表单的__init__
方法)。如果您希望它允许True
或False
而不是Python None
,那就更难了。
具体来说,BooleanField
的标准小部件是一个复选框。浏览器不会为未选中的复选框提交任何内容,因此复选框小部件会将提交中的字段缺失视为False
。没有办法区分用户没有从输入真正不好的情况中选择复选框。你可以使用不同的小部件(比如RadioSelect
)来至少使浏览器能够为False
提交一些内容,但你仍然遇到BooleanField
的问题to_python
方法在验证之前将其值转换为boolean
,因此您必须进行子类化和覆盖。
幸运的是,验证码不会将False
视为空,因此如果您这样做,您将能够设置required=True
并且不需要自定义清洁方法。