在Django表单中验证之前更改表单值

Nun*_*147 12 python django django-forms

我有一个django表单,在我的视图函数中我这样做:

search_packages_form = SearchPackagesForm( data = request.POST )
Run Code Online (Sandbox Code Playgroud)

我想覆盖一个名为price的表单字段,该表单字段已被删除:

price = forms.ChoiceField( choices = PRICE_CHOICES, required = False,widget = forms.RadioSelect )
Run Code Online (Sandbox Code Playgroud)

我想在调用之前覆盖表单字段 search_packages_form.is_valid()

我想到了:

search_packages_form.data['price'] = NEW_PRICE
Run Code Online (Sandbox Code Playgroud)

但它不起作用.有任何想法吗 ?

Ixi*_*xio 9

可能不是 Django 方式,而是基于/sf/answers/1211304531/我猜想在验证之前更改表单值的最简单方法是执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

这有效,但如果有人有另一种看起来更符合 Django 的方式,或者如果没有:然后解释原因,我会很感兴趣。

  • 您应该将“updated_request”传递给表单,而不是“request.POST”。 (2认同)

Hed*_*ide 0

form.is_valid()运行您的表单(以及模型的情况下ModelFormclean方法,返回TrueFalse

如果您计划更改表单数据,您可以在通用清理方法或字段级别执行此操作,例如

class YourForm(DerivingClass):
    # regular stuff

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

    def clean(self):
        # or here
        return super(YourForm, self).clean()
Run Code Online (Sandbox Code Playgroud)

  • 对我来说不好。我不能这样做。它必须在验证之前运行,并且不能在 clean 函数中发生。我基本上想更改来自用户的数据。 (3认同)