Django:覆盖单模型字段验证

Django:覆盖单模型字段验证,django,django-models,django-forms,Django,Django Models,Django Forms,我在一个案例中使用了django.db.models.fields.DecimalField,但其验证错误非常严重 比如,当用户输入3,4而不是3.4时,它会说-‘输入一个数字’。在一些国家,3,4和3.4一样多。至少对那些可能不太精通计算机的人来说 所以出于这个原因,我试图覆盖这个字段验证,这样我就可以自己验证它了 我的问题是-在调用modelforms clean_My_field()之前,模型自己的验证工作,并且它已经引发了一个错误 于是我抬起头来 读了这篇文章后,我明白我能做到 def

我在一个案例中使用了django.db.models.fields.DecimalField,但其验证错误非常严重

比如,当用户输入3,4而不是3.4时,它会说-‘输入一个数字’。在一些国家,3,4和3.4一样多。至少对那些可能不太精通计算机的人来说

所以出于这个原因,我试图覆盖这个字段验证,这样我就可以自己验证它了

我的问题是-在调用modelforms clean_My_field()之前,模型自己的验证工作,并且它已经引发了一个错误

于是我抬起头来

读了这篇文章后,我明白我能做到

def full_clean(self):
    super(MyModel, self).full_clean(exclude = '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_字段值是clean()方法中的旧值,无法找到已清理的_数据

所有这些让我觉得我的方法是错误的。我可以写我自己的字段,扩展django的DecimalField,我想。我认为这种方法会奏效。。。有人能帮我澄清一下,为什么它不起作用。如果它不起作用,为什么要排除在那里?顺便说一下,Django版本1.4.2

艾伦

编辑:我挖得更深。看起来,即使我覆盖了所有的模型清理方法,并且根本不在其中使用super,字段仍然会在某个时候被清理,并且到那时错误已经出现了

在本例中,我想我将对django.db.models.fields.DecimalField进行一些扩展


关于为什么在full_clean方法中存在exclude的答案仍然很好。如果它不起作用,为什么会在那里?

我知道这是一个老问题,但对于那些没有找到答案的问题,我所做的是在管理站点的ModelAdmin中添加localize=True:

def views_name(request):
    ......
    field = dec_num(form.cleaned-data['....'])
    .........

    return render(request, 'page.html', {.....})


def dec_num(value):
    return value.replace(",",".")
formfield_overrides = {
    models.DecimalField: {'localize': True},
}
这将使FormField区域设置敏感,接受逗号作为十进制分隔符(当然取决于当前区域设置)。它还将显示它的本地化


如果您的目标是单个DecimalField,或者您正在编写自定义表单或模型表单,请按照URL上的说明进行操作。

我知道这是一个老问题,但对于那些没有找到答案的问题,我所做的是在管理站点的ModelAdmin中添加localize=True:

formfield_overrides = {
    models.DecimalField: {'localize': True},
}
这将使FormField区域设置敏感,接受逗号作为十进制分隔符(当然取决于当前区域设置)。它还将显示它的本地化


如果您的目标是单个DecimalField,或者您正在编写自定义表单或模型表单,只需按照URL上的说明进行操作。

这可能几乎可以奏效。可能不是您编写的方式,而是类似dict=request.POST.copy()的方式。然后像使用dec_num()一样检查该值。然后将dict传递给form,而不是request.POST。但是视图对于表单/字段验证来说似乎不是一个好地方,这甚至可能几乎可以工作。可能不是您编写的方式,而是类似dict=request.POST.copy()的方式。然后像使用dec_num()一样检查该值。然后将dict传递给form,而不是request.POST。但是视图听起来不是表单/字段验证的好地方。我在前一段时间浏览了大量字段验证代码,并记住,似乎有很多不同的方法来进行验证。我的猜测是,
exclude
会阻止一个方法触发,但在您的案例中,这不是正在触发的方法。如果您还没有,我建议您仔细阅读源代码,看看发生了什么。好问题,我的+1。我刚刚创建了自己版本的DecimalField,并通过自己的验证解决了我的问题。不久前,我查看了大量字段验证代码,并记住,似乎有大量不同的方法可以执行此操作。我的猜测是,
exclude
会阻止一个方法触发,但在您的案例中,这不是正在触发的方法。如果您还没有,我建议您仔细阅读源代码,看看发生了什么。好问题,我的+1。我刚刚创建了自己版本的DecimalField,并进行了验证,解决了我的问题。