我在一个案例中使用django.db.models.fields.DecimalField,但其验证错误非常糟糕。
喜欢,当用户输入3,4而不是3.4时,它会说 - “输入一个数字”。在3,4是和3,4在一些国家一样多。至少对那些可能不熟悉计算机的人来说。
因此,我试图覆盖此字段验证,以便我自己验证它。
我的问题是 - 在调用modelforms clean_my_field()之前,模型自己的验证工作并且它已经引发了错误。
所以我查了https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects
读完之后,我明白我能做到
def full_clean(self):
super(MyModel, self).full_clean(exclude = 'my_field')
和my_field将被排除在验证之外,我可以在
中自行验证def clean(self)
pass
#how do i access cleaned data here anyway?
#self.cleaned_data does not exist
#is self.my_field the only way?
但是唉 - 它不起作用。 self.my_field值是clean()方法中的旧值,clean_data无处可寻。
所有这些让我觉得我的做法是错误的。我可以编写自己的字段来扩展django的DecimalField。我认为这种方法会起作用......有人可以为我清楚这一点 - 为什么它不起作用。如果不起作用,为什么要排除在那里?顺便说一下Django版本1.4.2。
艾伦
编辑:我挖得更深。似乎即使我覆盖所有模型清理方法并且根本不使用super - 这些字段在某些时候仍然被清除,并且此时错误已经被提升。
在这种情况下,我想我会做一些扩展到django.db.models.fields.DecimalField。
关于为什么在full_clean方法中存在排除的答案仍然很好。如果不起作用,为什么会出现?
答案 0 :(得分:1)
我知道这是一个老问题,但对于那些没有找到答案的人来说,我所做的就是在管理网站的ModelAdmin中添加localize = True:
formfield_overrides = {
models.DecimalField: {'localize': True},
}
这将使FormField语言环境清晰,接受逗号作为小数分隔符(当然取决于当前语言环境)。它还会显示它本地化。
https://docs.djangoproject.com/en/dev/topics/i18n/formatting/#locale-aware-input-in-forms
如果您要定位单个DecimalField,或者您正在编写自定义Form或ModelForm,请按照URL上的说明进行操作。
答案 1 :(得分:0)
def views_name(request):
......
field = dec_num(form.cleaned-data['....'])
.........
return render(request, 'page.html', {.....})
def dec_num(value):
return value.replace(",",".")