Cadena FormEncode validadores
-
16-09-2019 - |
Pregunta
Problema:
Tengo un formulario en TurboGears 2 que tiene un campo de texto para obtener una lista de correos electrónicos. ¿Hay una manera simple usando ToscaWidgets o FormEncode para formar la cadena de validadores de Set y E-mail o voy a tener que escribir mi propio validador para esto?
Solución
Creo que debería ser más como el siguiente. Tiene la ventaja de tratar cada correo electrónico en lugar de una simple parada en la primera válida. También agregará los errores al estado por lo que podría decir cuáles habían fracasado.
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]
Otros consejos
desde http://formencode.org/Validator.html
Otra validador notable es formencode.compound.All - este es un validador de compuesto - es decir, que es un validador que se lleva a validadores como entrada. Los esquemas son un ejemplo; En este caso todo toma una lista de validadores y aplica cada uno de ellos a su vez. formencode.compound.Any es su complemento, que utiliza el primer dispositivo de validación de paso en su lista.
Lo que quería era un validador que sólo podía pegar en un campo como la cuerda y validadores Int. Me pareció que no había manera de hacer esto a menos que creé mi propio validador. He publicado aquí para completarlo, y que otros puedan beneficiarse.
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 validadores - Pipe y la envoltura, se podría:
from formencode import validators, compound
compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
validators.Email())