我在用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壳:
>>> 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并添加此检查,以便它也可用于其他模型?
发布于 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,并且不需要自定义清理方法。
https://stackoverflow.com/questions/19328302
复制相似问题