这应该非常简单,但我不会从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.")})
答案 0 :(得分:3)
在模型中创建一个IntegerField,在表单中创建一个CharField。
您仍然可以使用modelform执行此操作,但您必须:
答案 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
...