Django-присвоить значение по умолчанию полю в форме ModelForm
В моем приложении у меня есть CreateView, который должен инициализировать некоторые поля модели со значением по умолчанию, отличным от значения по умолчанию, определенного внутри модели.
Я не хочу, чтобы пользователь редактировал значение, поэтому я помещаю поле в список exclude
class AForm(ModelForm):
class Meta:
model = AModel
exclude = ['a_field']
class AView(CreateView):
form_class = AForm
Вопрос в том, где я могу установить значение
a_field?Я попытался определить clean методы внутри AForm, например, таким образом
class AForm(ModelForm):
[...]
def clean(self):
d = super(AForm, self).clean()
d['a_field'] = 10
return d
Однако a_field устанавливается в любое значение по умолчанию, определенное в модели., а не 10. Я также попытался определить clean_a_field, но это просто не выполняется.
Если я удалю a_field из списка exclude, то clean и clean_a_field будут работать, но форма не будет проверяться, пока я не отрисоваю некоторые <input name="a_field"> внутри шаблона, что не является оптимальным.
4 ответов:
Исключите поле из формы, затем в представлении вы можете задать значение перед сохранением формы:
form = AForm(request.POST) if form.is_valid(): new_record = form.save(commit=False) new_record.a_field = 10 new_record.save()Вы также можете избежать списка
excludeи указать, какие поля вы хотите включить вfieldsattr определения формы. Смотрите первый абзац здесь, в docs.
Мне удалось решить проблему таким образом, что я доволен, хотя я все еще не на 100% доволен кодом.
a_fieldявляется обязательным (по модели) полем, поэтому необходимо отобразить<input name="a_field">внутри шаблона. Фокус был в том, чтобы сделатьa_fieldнеобязательным:class AForm(ModelForm): a_field = Field(required=False, widget=forms.HiddenInput) class Meta: model = AModel def clean_a_field(self): return 10Таким образом, я могу избежать визуализации поля в моем шаблоне, и форма все равно будет проверяться. И даже если форма отображается с помощью
{{ form.as_p }},widget=forms.HiddenInputспасает мне жизнь.
В модели задается значение по умолчанию. Из официального документа ,
полевая модель.CharField (max_length=7, default="), например
У меня есть способ справиться с этой ситуацией. Выполните следующий процесс:
Удалите 'a_field' из исключает в форме.
Не выставляйте 'a_field' в шаблоне HTML. т. е. не давайте пользователю возможность изменить значение через форму в шаблоне. Это гарантировало бы, что обычный пользователь не будет изменять значение.
Чтобы полностью предотвратить, over-ride
get_form_kwargsв поле зрения. Это обеспечит или перегонит ваш желаемый значение 'a_field' и сохраните егоНапример
class AView(CreateView): form_class = AForm def get_form_kwargs(self): kwargs = super(AView, self).get_form_kwargs() if self.request.method in {'POST', 'PUT'}: # Change post data to over-ride or provide value of 'a_field' data = self.request.POST.copy() data.update({ 'a_field': 'value' }) kwargs['data'] = data return kwargs
Comments