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

| 这应该很简单,但是我没有从Django文档中弄清楚。我有一个IntegerField模型字段,从中我创建了一个ModelForm字段。有问题的字段包含$值(价格),从UX的角度来看,如果用户在输入$ 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.\")})
    
已邀请:
        在模型中创建一个IntegerField,在表单中创建一个CharField。 您仍然可以使用modelform来执行此操作,但是您必须: 从表单中“排除”模型字段, 以以下形式编写clean_bill方法 将模型字段的值设置为已解析的整数值 试试这个和/或这个     
        你是对的。根据Django表单和字段验证文档,它甚至不会转到您的
clean
方法,并且已经在第一步中提高了
ValidationError
to_python
方法)。 我认为在表单级别上您无能为力。但是,您可以做的是在将视图中的“ 5”数据传递到表单之前对其进行处理。一些简单的例子:
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
...
    

要回复问题请先登录注册