如何将字段属性值传递给Django表单字段错误消息

时间:2014-01-22 22:28:48

标签: python django django-forms

我想更改表单验证错误消息“此字段是必需的”以包含字段的标签,例如“名称字段是必需的”。 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__方法来构建我想要的错误消息,但我想要一种更清洁的方式。

1 个答案:

答案 0 :(得分:0)

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

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

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

ValidationError也不做任何事情)

其他一些错误允许错误字符串中的某些特定变量(发现它们只是在raise ValidationError中搜索django/forms/fields.py)但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)