2014-01-16 38 views
0

这里是如何MinLengthValidator在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那样做。

+0

请提供完整的堆栈跟踪。 – Serafeim

回答

0

看起来您使用的是早期版本的Django,因此您应该将代码基于您的Django版本的MinLengthValidator,而不是当前的实现。由于在Django 1.6中更改了ungettext_lazy方法,因此您会收到错误消息(请参见凭证#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).', 
) 

而不是设置消息你实例验证后属性的,你可以继承它:

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).') 
})