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?

¿Fue útil?

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())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top