2009-07-15 3 views
0

Проблема:Chain FormEncode Validators

У меня есть форма в TurboGears 2, который имеет текстовое поле для списка сообщений электронной почты. Есть ли простой способ использования ToscaWidgets или FormEncode для цепочки проверки формы для Set и Email или мне нужно написать для этого свой собственный валидатор?

ответ

0

Я думаю, что это должно быть больше похоже на нижеследующее. Преимущество состоит в том, что вы пытаетесь использовать каждое электронное письмо вместо того, чтобы просто останавливаться при первом недопустимом. Он также добавит ошибки в состояние, чтобы вы могли сказать, какие из них были неудачными.

from formencode import FancyValidator, Invalid 
from formencode.validators import Email 

class EmailList(FancyValidator): 
    """ Takes a delimited (default is comma) string and returns a list of validated e-mails 
     Set the delimiter by passing delimiter="A_DELIMITER" to the constructor. 
     Also takes all arguments a FancyValidator does. 
     The e-mails will always be stripped of whitespace. 
    """ 
    def _to_python(self, value, state): 
     try: 
      values = str(value).split(self.delimiter) 
     except AttributeError: 
      values = str(value).split(',') 
     validator = formencode.ForEach(validators.Email()) 
     validator.to_python(values, state) 
     return [value.strip() for value in values] 
+0

Интересно, мне нравится обновление. – Robbie

+0

Хотя строка 13 должна возвращать значения: значения = validator.to_python (значения, состояние) – Robbie

0

То, что я хотел, было валидатором, который я мог бы просто вставить в поле, например, для валидаторов String и Int. Я обнаружил, что не было никакого способа сделать это, если бы я не создал свой собственный валидатор. Я размещаю его здесь для полноты, и другие могут принести пользу.

from formencode import FancyValidator, Invalid 
from formencode.validators import Email 

class EmailList(FancyValidator): 
    """ Takes a delimited (default is comma) string and returns a list of validated e-mails 
     Set the delimiter by passing delimiter="A_DELIMITER" to the constructor. 
     Also takes all arguments a FancyValidator does. 
     The e-mails will always be stripped of whitespace. 
    """ 
    def _to_python(self, value, state): 
     try: 
      values = str(value).split(self.delimiter) 
     except AttributeError: 
      values = str(value).split(',') 
     returnValues = [] 
     emailValidator = Email() 
     for value in values: 
      returnValues.append(emailValidator._to_python(value.strip(), state)) 
     return values 
1

из http://formencode.org/Validator.html

Других известными валидаторы formencode.compound.All - это соединение валидатор - то есть, это валидатор, который принимает в качестве входных данных валидаторов. Схемы - один из примеров; в этом случае All принимает список валидаторов и применяет каждую из них по очереди. formencode.compound.Any - это его комплимент, который использует первый передающий валидатор в своем списке.

0

С FormEncode validators - Трубопроводная обертка, вы можете:

from formencode import validators, compound 


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')), 
       validators.Email()) 
Смежные вопросы