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

Joh*_*n C 15 django django-models

我想创建一个具有默认值的Django模型Field(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
Run Code Online (Sandbox Code Playgroud)

(我一次只使用一个字段声明行.:)

我甚至不确定我是否正确地声明了默认值.我能找到的唯一参考是关于James Bennett 处理选择的文章.我还没有在Django文档中找到它(我使用的是1.2版本 - 也许是1.3版本?)

更新 - 我尝试在MySql数据库中设置字段的默认值,无效.似乎,即使表单没有字段值,它也会继续向DB 分配null,覆盖MySql默认值.

虽然我目前只是在创建表单的视图中设置默认值 - 我真的不喜欢它,因为它在视图中负责字段的完整性,而不是DB.

认为它可行的方式是,可以在表单中设置或不设置字段 - 如果设置,该值将写入DB,如果设置,则将使用DB默认值.相反,如果未设置,表单将向数据库写入null.那么,如果不使用ModelField声明中的默认值,那有什么意义呢?它到底是做什么用的?

Jer*_*zyk 19

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

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

class InvoiceForm(forms.ModelForm):
    class Meta:
        model = Invoice
Run Code Online (Sandbox Code Playgroud)

更新,以防万一没有设置值,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
Run Code Online (Sandbox Code Playgroud)