【问题标题】:Django--Form validation (Why can't I manually clean an Integer Form Field)Django--表单验证(为什么我不能手动清理整数表单字段)
【发布时间】:2011-06-22 02:26:27
【问题描述】:

这应该很简单,但我没有从 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.")})

【问题讨论】:

    标签: python django django-models django-validation


    【解决方案1】:

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

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

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

    try this 和/或this

    【讨论】:

      【解决方案2】:

      是的,你是对的。根据Django docs of form and field validation,它甚至不会转到您的clean 方法,并且已经在第一步中提出ValidationErrorto_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
      ...
      

      【讨论】:

      • 啊,关于制作副本的好点子。你喜欢我想出的这种正则表达式解决方案吗?
      • 我认为您的 RegexField 方法仍然是更清洁的方法。这种方式只是如果您仍然想使用IntegerField
      猜你喜欢
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 2020-11-27
      • 1970-01-01
      • 2023-04-05
      相关资源
      最近更新 更多