如何为Django model Integerfield指定默认值,而相关FormField是可选的?

如何为Django model Integerfield指定默认值,而相关FormField是可选的?,django,django-models,Django,Django Models,我想创建一个带有默认值的Django模型字段(IntegerField),并创建一个从模型派生的表单,其中该字段是可选的。如果未在表单上设置,则在保存表单时,希望将默认值保存到DB # model.py class Invoice(models.Model): # IntegrityError "Column 'expireDays' cannot be null" expireDays = models.PositiveSmallIntegerField(default=1)

我想创建一个带有默认值的Django模型字段(IntegerField),并创建一个从模型派生的表单,其中该字段是可选的。如果未在表单上设置,则在保存表单时,希望将默认值保存到DB

# model.py
class Invoice(models.Model):
    # IntegrityError "Column 'expireDays' cannot be null"
    expireDays = models.PositiveSmallIntegerField(default=1)

    # expireDays = *null* in DB
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True)

# forms.py
class InvoiceForm(forms.ModelForm):
    # leaving this line out gives invalid form
    expireDays = forms.IntegerField(required=False)
    class Meta:
        model = Invoice
(我一次只使用一个字段声明行。:)

我甚至不确定是否正确声明了默认值。我能找到的唯一参考资料是詹姆斯·贝内特的一篇文章。我还没有在Django文档中找到它(我使用的是1.2版-可能是1.3版?)

更新-我尝试在MySql数据库中设置字段的默认值,但没有效果。看起来,即使表单没有字段值,它也会继续将null赋值给DB,而不是MySql的默认值

虽然我目前只是在创建表单的视图中设置一个默认值,但我并不喜欢这样,因为它将字段完整性的责任放在视图中,而不是DB中


我认为它的工作方式是,字段可以设置,也可以不设置,如果设置,该值将写入DB,如果不设置,将使用DB默认值。相反,如果未设置,则表单将向DB写入null。那么,如果ModelField声明中没有使用默认值,那么它有什么意义呢?它具体做什么?

我希望字段是可选的-只需在模型中保留第二个定义,而不在表单定义中添加任何内容:

class Invoice(models.Model):
    expireDays = models.PositiveSmallIntegerField(default=1, blank=True, null=True)

class InvoiceForm(forms.ModelForm):
    class Meta:
        model = Invoice
更新,以便在没有设置值的情况下,使用
1
作为字段值:

class InvoiceForm(forms.ModelForm):

    def clean_expireDays(self):
        exp_days = self.cleaned_data.get('expireDays')
        if exp_days is None:
            return self.fields['expireDays'].initial
            # above can be: return 1
            # but now it takes value from model definition
        else:
            return exp_days

    class Meta:
        model = Invoice

我的帖子可能不太清楚,但这是我尝试过的组合之一——当我这样做时,MySql数据字段显示为null,而不是1。对更新的注释——实际上,我是用另一种方式——在将帖子数据传递到表单之前,将(复制的)帖子数据中的字段设置为默认值1。但这仍然将维护数据完整性的逻辑放在表单中,而不是我想要的数据库中。MySql数据库应该分配默认值。我希望发生的是,如果表单没有得到一个值,它不会尝试设置DB值——但它似乎给DB分配了一个NULL,这甚至超过了我在DB中手动设置的默认值。