1

我在一种情况下使用 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。

艾伦

编辑:我挖得更深。似乎即使我覆盖了所有模型清理方法并且根本不在它们中使用超级 - 字段仍然在某个时候被清理并且到那时已经引发了错误。

我想我会在这种情况下对 django.db.models.fields.DecimalField 做一些扩展。

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

4

2 回答 2

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 或者您正在编写自定义表单或模型表单,只需按照 URL 上的说明进行操作。

于 2013-09-03T02:54:12.263 回答
0
def views_name(request):
    ......
    field = dec_num(form.cleaned-data['....'])
    .........

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


def dec_num(value):
    return value.replace(",",".")
于 2013-02-08T08:11:24.677 回答