17

我有一个 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

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

4

4 回答 4

10

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

于 2018-03-15T09:46:23.167 回答
1

我的解决方案是建立在较早的提议之上的。这是一个可行的解决方案,可以在多种情况下使用。

@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

希望它有用!

于 2021-02-17T06:23:22.743 回答
1

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

changed_data = dict(request.POST)
changed_data['price'] = NEW_PRICE
search_packages_form = SearchPackagesForm(data = changed_data)
于 2018-07-24T09:37:51.650 回答
0

form.is_valid()贯穿您的表单(和模型,如果是 a ModelFormclean方法,返回TrueFalse

如果您计划更改表单数据,您可以在一般的 clean 方法或字段级别进行,例如

class YourForm(DerivingClass):
    # regular stuff

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

    def clean(self):
        # or here
        return super(YourForm, self).clean()
于 2013-08-30T13:45:12.297 回答