如何为Django模型Integerfield分配默认值,而相关的FormField是可选的?

时间:2011-05-15 22:49:13

标签: django django-models

我想创建一个带有默认值的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声明中的默认值,那有什么意义呢?它到底是做什么的?

1 个答案:

答案 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