Django:覆盖单个模型字段验证

时间:2013-02-08 08:05:21

标签: django django-models django-forms

我在一个案例中使用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方法中存在排除的答案仍然很好。如果不起作用,为什么会出现?

2 个答案:

答案 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(",",".")