Django--表单验证(为什么不能手动清理整数表单字段)

3 投票
2 回答
2601 浏览
提问于 2025-04-16 20:03

这看起来应该很简单,但我从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
...
4

在模型里创建一个整数类型的字段,在表单里创建一个字符类型的字段。

你仍然可以使用模型表单来实现这个,但你需要:

  1. 在表单中'排除'模型字段,
  2. 在表单里写一个叫做 clean_bill 的方法,
  3. 把模型字段的值设置为解析后的整数值。

可以试试这个和/或 这个

撰写回答