2

这应该很简单,但我没有从 Django 文档中弄清楚。我有一个 IntegerField 模型字段,我从中创建了一个 ModelForm 字段。有问题的字段包含 $ 值(价格),如果用户在输入 $10 而不是 10 时没有收到错误消息(“输入整数”),则从用户体验的角度来看,这将是更可取的。

我尝试过手动清理表单,但似乎 clean_field 方法是在其他验证方法之后运行的。到目前为止,我的阅读似乎也证实了这一点。

    def clean_bill(self):
          bill = self.cleaned_data["bill"]
          if '$' in bill:
              bill=bill.replace('$','',1)   
          return bill

在保持模型表单中的 IntegerField 的同时有没有办法解决这个问题?我应该把它变成一个 RegexField 吗?

编辑:我最终选择了上述内容和 RegexField 的组合。仍然好奇是否有另一种/更好的方法。

        bill= forms.RegexField(label=_("Bill"), max_length=10,required=True, regex=r'^\$?[\d]+$',
    error_messages = {'invalid': _("Please enter a whole number.")})
4

2 回答 2

3

在模型中创建一个 IntegerField,在表单中创建一个 CharField。

您仍然可以使用 modelform 来执行此操作,但您必须:

  1. 从表单中“排除”模型字段,
  2. 在表单中编写一个 clean_bill 方法
  3. 将模型字段的值设置为解析的整数值

试试这个和/或这个

于 2011-06-22T04:19:06.857 回答
1

是的你是对的。根据表单和字段验证的 Django 文档,它甚至不会进入您的clean方法,并且已经ValidationError在第一步(to_python方法)中提出。我认为在表单级别上您无能为力。不过,您可以做的是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
...
于 2011-06-22T03:25:46.100 回答