2013-12-14 3 views
0

Я пишу пользовательский валидатор, который получает список валидаторов и проверяет, проходит ли кто-либо из них, поэтому вы можете легко проверить такие вещи, как , это целочисленное поле должно быть ниже чем 10 или выше 100. Это то, что у меня есть до сих пор:Не удается получить сообщение об исключении в пользовательском валидаторе Django

class ValidateAnyOf(object): 
    def __init__(self, *validators): 
     self.validators = validators 

    def __call__(self, value): 
     errors = [] 
     for validator in self.validators: 
      try: 
       validator(value) 
       return 
      except ValidationError as e: 
       errors.append(e.message) 

     raise ValidationError('Combined validation failed:' + ','.join(errors)) 

class TestModel(models.Model): 
    score = models.IntegerField(validators=[ValidateAnyOf(validators.MaxValueValidator(10), 
                  validators.MinValueValidator(100))]) 

Логика в порядке. Проблема возникает, когда ни один из валидаторов не проходит. Я хочу показать список ошибок, поэтому я храню в списке сообщения из исключений. Проблема в том, что e.message представляется объектом django.utils.functional.__proxy__ вместо строки, поэтому я не могу присоединиться к ним, чтобы показать полное сообщение об ошибке.

Как я могу получить сообщение об ошибке из каждого исключения?

ответ

1

Это экземпляр django.utils.functional.__proxy__, поскольку message валидаторов ядра Django можно перевести и обернуть в ugettext_lazy. Я думаю, вы можете использовать что-то вроде ", ".join(unicode(e) for e in errors), чтобы заставить оценить сообщение.

+1

'unicode (e.message)' сделал трюк. Мне пришлось вручную передать параметры для заполнителей, используя 'errors.append (unicode (e.message)% e.params)', и это сработало. –

+0

Вы также можете использовать django.utils.encoding.force_text вместо unicode. – ybendana

Смежные вопросы