изменить значение формы перед валидацией в форме Django

У меня есть форма django и функция my view я делаю это:

search_packages_form = SearchPackagesForm( data = request.POST )

Я хотел бы переписать поле формы, называемое ценой, которое будет уменьшено как таковое:

price = forms.ChoiceField( choices = PRICE_CHOICES, required = False,widget = forms.RadioSelect )

Я хотел бы перезаписать поле формы перед вызовом search_packages_form.is_valid()

Я думал:

search_packages_form.data['price'] = NEW_PRICE

Но это не работает. Есть идеи?

Ответ 1

Вероятно, это не путь Django, а на основе fooobar.com/questions/1488138/... Я предполагаю, что самый простой способ изменить значение формы перед проверкой - сделать что-то вроде следующего:

def search_packages_view(request):
    if request.method == 'POST'
        updated_request = request.POST.copy()
        updated_request.update({'price': NEW_PRICE})
        search_packages_form = SearchPackagesForm(updated_request)
        if search_packages_form.is_valid():
             # You're all good

Это работает, но мне было бы интересно, если у кого-то есть другой способ, который кажется более похожим на Django, или если нет: тогда объяснение о том, почему.

Ответ 2

один трюк за то, что вы хотите, это сделать так:

changed_data = dict(request.POST)
changed_data['price'] = NEW_PRICE
search_packages_form = SearchPackagesForm(data = changed_data)

Ответ 3

form.is_valid() проходит через вашу форму (и модели в случае ModelForm) clean метод, возвращая True или False

Если вы планируете изменять данные формы, вы можете сделать это в рамках общего метода очистки или на уровне поля, например

class YourForm(DerivingClass):
    # regular stuff

    def clean_<ATTR>(self):
        # here
        return self.cleaned_data

    def clean(self):
        # or here
        return super(YourForm, self).clean()