考虑以下模型字段:
myfield = models.IntegerField(_('My field'), blank=True, default=0)
如果从帖子中完全省略了myfield,则默认的ModelForm实现会正确使用默认值。但是,如果为该字段发布空字符串,则字段值保持为None并且postgres在非空字段上出现IntegrityError失败:
IntegrityError :列" myfield"中的空值违反了非空 约束
问题:如果myfield值不存在或存在但空字符串的情况下如何强制执行默认值?
是什么让我觉得这是一个django错误,ModelForm验证成功通过,但它无法保存表单。尽管语义字段声明是正确的,并且如果空字符串不是字段的有效值,则表单验证应该失败,否则应确保为字段值分配适当的整数。
实现一个clean方法来替换具有默认值的空字符串是可能的,但非常难看。寻找更好的方法:
答案 0 :(得分:2)
这显然是预期的行为,对它的引用是在this wiki page上进行的。
default
是创建新对象时用于字段的默认值,并且没有为该字段指定任何排序值。在表单中传递空值时,不用于填充字段。
blank
指定表单中是否允许空值。但它无法控制该空值是否在数据库中有效。
结果default
将无法在此处执行您想要的操作,并且当您在表单中传递空字符串时,它将作为空值传递给数据库。
您有两种选择:
在字段上设置null=True
以允许空值(但这在语义上可能没有意义)。
覆盖模型上的clean
方法,在保存之前将空值转换为0,例如:
def clean(self):
if self.myfield is None:
self.myfield = 0