изменить значение формы перед валидацией в форме 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()