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