当blank = True并且发布空字符串时,Django IntegerField会忽略指定的默认值

时间:2017-12-14 17:42:18

标签: django django-models django-forms

考虑以下模型字段:

myfield = models.IntegerField(_('My field'), blank=True, default=0)

如果从帖子中完全省略了myfield,则默认的ModelForm实现会正确使用默认值。但是,如果为该字段发布空字符串,则字段值保持为None并且postgres在非空字段上出现IntegrityError失败:

  

IntegrityError :列" myfield"中的空值违反了非空   约束

问题:如果myfield值不存在或存在但空字符串的情况下如何强制执行默认值?

是什么让我觉得这是一个django错误,ModelForm验证成功通过,但它无法保存表单。尽管语义字段声明是正确的,并且如果空字符串不是字段的有效值,则表单验证应该失败,否则应确保为字段值分配适当的整数。

实现一个clean方法来替换具有默认值的空字符串是可能的,但非常难看。寻找更好的方法:

1 个答案:

答案 0 :(得分:2)

这显然是预期的行为,对它的引用是在this wiki page上进行的。

default是创建新对象时用于字段的默认值,并且没有为该字段指定任何排序值。在表单中传递空值时,用于填充字段。

blank指定表单中是否允许空值。但它无法控制该空值是否在数据库中有效。

结果default将无法在此处执行您想要的操作,并且当您在表单中传递空字符串时,它将作为空值传递给数据库。

您有两种选择:

  1. 在字段上设置null=True以允许空值(但这在语义上可能没有意义)。

  2. 覆盖模型上的clean方法,在保存之前将空值转换为0,例如:

    def clean(self):
        if self.myfield is None:
            self.myfield = 0