【问题标题】:How to pass field attribute value to Django form field error message如何将字段属性值传递给 Django 表单字段错误消息
【发布时间】:2014-01-22 22:28:47
【问题描述】:

我想更改表单验证错误消息“此字段是必需的” 以包含字段的标签,例如“名称字段是必需的”。 Django 是否提供了一种简单的方法来引用错误消息中的字段属性?

errors = {
    'required': _('{label} field is required')
}

class MyForm(forms.Form):
    name = forms.CharField(label=_('Name'), error_messages=errors, max_length=80)
    age = forms.IntegerField(label=_('Age'), error_messages=errors)

我知道我可以重写表单的 __init__ 方法来构建我想要的错误消息,但我想要一种更简洁的方式。

【问题讨论】:

  • 不,很确定你必须覆盖__init__
  • @Anentropic 你错了。查看默认的 Invalid_choice 消息:Select A Valid Choice。 %(Value)S 不是可用选项之一.
  • 这与“字段是必需的”错误消息的情况无关,它不采用任何格式变量。但是我认为覆盖表单的 __init__ 可能也不是最好的方法

标签: python django django-forms


【解决方案1】:

可以在错误消息中使用 Python 字符串格式,但您可能需要使用自定义 Field 子类。

对于您要自定义的特定错误消息 - 必填字段 - Django 的 Field 类只会引发错误而不尝试任何字符串替换:

def validate(self, value):
    if value in validators.EMPTY_VALUES and self.required:
        raise ValidationError(self.error_messages['required'])

ValidationError 也不做任何事情)

其他一些错误允许错误字符串中有一些特定的变量(要找到它们,只需在 django/forms/fields.py 中搜索 raise ValidationError)但是 Django 给你想要的一个问题是字段实例 没有知道自己的名字。除非你传入 label kwarg,否则字段实例也不知道它的标签,所以在引发异常的地方,Django 没有什么可以给你的。

在您的情况下,您正在为所有字段传递自定义标签,因此您可以尝试以下 mixin 来简化您需要的自定义字段类:

class RequiredErrorMsgMixin(object):
    def validate(self, value):
        if value in validators.EMPTY_VALUES and self.required:
            raise ValidationError(
                self.error_messages['required'].format(label=self.label)
            )

class CustomCharField(RequiredErrorMsgMixin, CharField):
    pass

class CustomIntField(RequiredErrorMsgMixin, IntField):
    pass

errors = {
    'required': _('{label} field is required')
}

class MyForm(forms.Form):
    name = CustomCharField(label=_('Name'), error_messages=errors, max_length=80)
    age = CustomIntegerField(label=_('Age'), error_messages=errors)

【讨论】:

  • 是的,您是对的,默认情况下错误消息无法访问实例。但由于我有很多不同的字段,我选择使用 CustomFormMixin,它简单地遍历其 __init__ 方法中的所有字段并更新消息:field.error_messages['required'] = _(error_message).format(field.label)
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 1970-01-01
  • 2021-06-22
  • 2018-11-10
  • 2021-06-27
  • 1970-01-01
相关资源
最近更新 更多