Django:更改MinLengthValidator错误消息

时间:2014-01-16 11:53:26

标签: django

以下是在Django中定义MinLengthValidator的方法:

class MinLengthValidator(BaseValidator):
    compare = lambda self, a, b: a < b
    clean = lambda self, x: len(x)
    message = ungettext_lazy(
        'Ensure this value has at least %(limit_value)d character (it has %(show_value)d).',
        'Ensure this value has at least %(limit_value)d characters (it has %(show_value)d).',
        'limit_value')
    code = 'min_length'

我尝试在我的代码中更改错误消息,如下所示:

password_min_length_validator = MinLengthValidator(8)
password_min_length_validator.message = ungettext_lazy(
    'Ensure password has at least %(limit_value)d character (it has %(show_value)d).',
    'Ensure password has at least %(limit_value)d characters (it has %(show_value)d).',
    'limit_value')

但是我收到了这个错误:

ugettext() takes exactly 1 argument (3 given)

我这样做就像django.core.validators一样。

1 个答案:

答案 0 :(得分:0)

看起来您正在使用早期版本的Django,因此您应该将代码基于Django版本的MinLengthValidator,而不是当前的实现。您收到错误是因为Django 1.6中更改了ungettext_lazy方法(请参阅ticket #19160)。

例如,在Django 1.5.X中,您可以这样做:

from django.utils.translation import ugettext_lazy as _

class MinLengthValidator(BaseValidator):
    compare = lambda self, a, b: a < b
    clean = lambda self, x: len(x)
    message = _('Ensure this value has at least %(limit_value)d characters (it has %(show_value)d).')
    code = 'min_length'

password_min_length_validator = MinLengthValidator(8)
password_min_length_validator.message = _(
    'Ensure password has at least %(limit_value)d characters (it has %(show_value)d).',
)

在实例化验证器后,您可以将其子类化为

,而不是设置messages属性
class MyMinLengthValidator(MinLengthValidator):
    message = _('Ensure my_field has at least %(limit_value)d characters (it has %(show_value)d).')

my_min_length_validator = MyMinLengthValidator(8)

或者,您可以在表单字段中使用error_messages选项:

class MyForm(forms.Form):
    my_field = forms.CharField(validators=[MinLengthValidator(8)], 
                        error_messages={'min_length': _('Ensure my_field has at least %(limit_value)d characters (it has %(show_value)d).')
})