Django--表单验证(为什么不能手动清理整数表单字段)
这看起来应该很简单,但我从Django的文档中没搞明白。我有一个整数类型的模型字段,然后用它创建了一个模型表单字段。这个字段是用来存储价格的,用户输入$10而不是10时,最好不要出现错误提示(比如“请输入整数”)。
我尝试过手动清理表单,但发现clean_field这个方法是在其他验证方法之后运行的。到目前为止,我的理解似乎也证实了这一点。
def clean_bill(self):
bill = self.cleaned_data["bill"]
if '$' in bill:
bill=bill.replace('$','',1)
return bill
有没有办法在保持模型表单中的整数字段的同时解决这个问题?我是不是应该直接把它改成正则表达式字段?
补充:我最后选择了上述方法和正则表达式字段的组合。还是想知道有没有其他更好的方法。
bill= forms.RegexField(label=_("Bill"), max_length=10,required=True, regex=r'^\$?[\d]+$',
error_messages = {'invalid': _("Please enter a whole number.")})
2 个回答
1
没错,你说得对。根据Django关于表单和字段验证的文档,在第一步(to_python
方法)就会直接抛出ValidationError
,根本不会进入你的clean
方法。
在表单层面上,我觉得你能做的事情不多。不过,你可以在视图中处理POST
数据,然后再把它传给表单。下面是一个简单的例子:
post_dict = request.POST.copy() #makes a copy of request.POST so you can modify it
bill = post_dict['bill']
if '$' in bill:
bill = bill.replace('$','',1)
post_dict['bill'] = bill
# pass post_dict to your form instead of request.POST
...