如何为Django model Integerfield指定默认值,而相关FormField是可选的?
我想创建一个带有默认值的Django模型字段(IntegerField),并创建一个从模型派生的表单,其中该字段是可选的。如果未在表单上设置,则在保存表单时,希望将默认值保存到DB如何为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)
# 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中手动设置的默认值。