繁体   English   中英

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

[英]change a form value before validation in Django form

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

search_packages_form = SearchPackagesForm( data = request.POST )

我想覆盖一个名为 price 的表单字段,它被这样声明:

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

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

我想这样做:

search_packages_form.data['price'] = NEW_PRICE

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

可能不是 Django 方式,而是基于https://stackoverflow.com/a/17304350/2730032我猜想在验证之前更改表单值的最简单方法是执行以下操作:

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 的方式,或者如果没有:然后解释原因,我会很感兴趣。

你想要的一个技巧是这样做:

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

我的解决方案建立在较早的提议之上。 它是一种有效的解决方案,可用于多种情况。

@Milad Khodabandehloo 有一个棘手的解决方案来解决这个问题。

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

正如@The EasyLearn Academy 评论的那样:它不允许您访问以表格形式提交的实际数据。

这是因为 request.POST 是不可变的。

但是这个问题有一个解决方案 - 只是需要更棘手。

此解决方案仅在对对象的引用足以满足特定原因时才有效。 它使对象本身保持不变。

# write object to variable (data)
data = request.POST

# set to mutable
data._mutable = True

# modify the values in data 
data[modified_field] = new_value

# set mutable flag back (optional)
data._mutable = False

希望有用!

form.is_valid()贯穿您的表单(以及ModelForm模型)的clean方法,返回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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM