Подтвердить что ты не робот

Как назначить значение по умолчанию для модели Django Integerfield, в то время как связанный с этим FormField является необязательным?

Я хочу создать поле модели Django (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

(Я использовал только одну из строк объявления поля за раз.:)

Я даже не уверен, что правильно объявляю значение по умолчанию. Единственная ссылка, которую я мог найти, была в статье о обработке вариантов Джеймсом Беннеттом. Я еще не нашел его в документах Django (я использую версию 1.2 - возможно, это в 1.3?)

Обновление - я попробовал установить значение по умолчанию для поля в базе данных MySql, чтобы не повлиять. Кажется, что даже если форма не имеет значения для поля, она идет вперед и присваивает значение null БД, превышая значение по умолчанию MySql.

Хотя в настоящее время я просто устанавливаю значение по умолчанию в представлении, которое создает форму - мне это не очень нравится, поскольку он несет ответственность за целостность поля в представлении, а не за БД.

Как я мог подумать, что это сработает, это то, что поле может быть установлено или нет в форме - если установлено, это значение будет записано в БД, а если не установлено, то по умолчанию DB будет используемый. Вместо этого, если не задано, форма записывает нуль в БД. Итак, какой смысл иметь значение по умолчанию в объявлении ModelField, если оно не используется? Что именно он делает?

4b9b3361

Ответ 1

i вы хотите, чтобы поле было необязательным - просто оставьте второе определение в модели и не добавляйте ничего в определение формы:

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