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

时间:2011-06-22 02:26:28

标签: python django django-models django-validation

这应该非常简单,但我不会从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.")})

2 个答案:

答案 0 :(得分:3)

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

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

  1. 从表单中“排除”模型字段
  2. 的形式编写clean_bill方法
  3. 将模型字段的值设置为已解析的整数值
  4. try this和/或this

答案 1 :(得分:1)

是的,你是对的。根据{{​​3}},它甚至不会转到您的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
...