Цепочка валидаторов FormEncode
-
16-09-2019 - |
Вопрос
Проблема:
У меня есть форма в TurboGears 2, в которой есть текстовое поле для списка электронных писем.Есть ли простой способ использовать ToscaWidgets или FormEncode для создания цепочки валидаторов форм для Set и Email, или мне придется написать для этого свой собственный валидатор?
Решение
Я думаю, что это должно быть больше похоже на то, что показано ниже.Его преимущество заключается в том, что вы проверяете каждое электронное письмо, а не просто останавливаетесь на первом недействительном.Он также добавит ошибки в состояние, чтобы вы могли определить, какие из них потерпели неудачу.
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]
Другие советы
от http://formencode.org/Validator.html
Еще один известный валидатор — formencode.compound.All — это составной валидатор, то есть валидатор, который принимает валидаторы в качестве входных данных.Схемы являются одним из примеров;в этом случае All берет список валидаторов и применяет каждый из них по очереди.formencode.compound.Any — это его дополнение, которое использует первый проходящий валидатор в своем списке.
Мне нужен был валидатор, который можно было бы просто вставить в поле, например, валидаторы 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
С Валидаторы FormEncode - Труба и обертка, вы можете:
from formencode import validators, compound
compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
validators.Email())