Цепные валидаторы FormEncode - PullRequest
0 голосов
/ 15 июля 2009

Проблема:

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

Ответы [ 4 ]

1 голос
/ 18 октября 2010

от http://formencode.org/Validator.html

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

0 голосов
/ 21 ноября 2016

С валидаторами FormEncode - Pipe и Wrapper вы можете:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())
0 голосов
/ 16 июля 2009

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

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 голосов
/ 15 июля 2009

Мне нужен был валидатор, который я мог просто вставить в поле, такое как валидаторы 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
...