[英]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
方法,返回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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.