我想创建一个带有默认值的Django模型Field(IntegerField),还要创建一个从模型派生的表单,其中该字段是可选的。如果没有在表单上设置,那么当我保存表单时,我希望保存到数据库的默认值。
# 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
(我一次只使用一个字段声明行。)
我甚至不确定我是否正确声明默认值。我能找到的唯一参考是James Bennett撰写的handling choices文章。我还没有在Django文档中找到它(我使用的是1.2版本 - 也许是1.3版本?)
更新 - 我尝试在MySql数据库中设置字段的默认值,无效。好像,即使 form 没有该字段的值,它也会继续向数据库分配 null ,覆盖MySql默认值。
虽然我目前只是在创建表单的视图中设置默认值 - 我真的不喜欢这样,因为它将字段完整性的责任放在视图中,而不是D B。
我思考它的工作方式是,可以在表单中设置或不设置字段 - 如果设置,该值将写入数据库,如果< em> not 设置,将使用数据库默认值。相反,如果没有设置,表单会将 null 写入数据库。那么,如果不使用ModelField声明中的默认值,那有什么意义呢?它到底是做什么的?
答案 0 :(得分:18)
我希望字段是可选的 - 只需在模型中保留第二个定义,不要在表单定义中添加任何内容:
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