Как назначить значение по умолчанию для модели 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, если оно не используется? Что именно он делает?
Ответы
Ответ 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