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"> внутри шаблона, что не является оптимальным.

714   4  

4 ответов:

Исключите поле из формы, затем в представлении вы можете задать значение перед сохранением формы:

form = AForm(request.POST)
if form.is_valid():
    new_record = form.save(commit=False)
    new_record.a_field = 10
    new_record.save()

Вы также можете избежать списка exclude и указать, какие поля вы хотите включить в fields attr определения формы. Смотрите первый абзац здесь, в 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="), например

У меня есть способ справиться с этой ситуацией. Выполните следующий процесс:

  1. Удалите 'a_field' из исключает в форме.

  2. Не выставляйте 'a_field' в шаблоне HTML. т. е. не давайте пользователю возможность изменить значение через форму в шаблоне. Это гарантировало бы, что обычный пользователь не будет изменять значение.

  3. Чтобы полностью предотвратить, 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

    Ничего не найдено.