Pergunta

Problema:

Eu tenho um formulário em TurboGears 2 que tem um campo de texto para uma lista de e-mails. Existe uma maneira simples usando ToscaWidgets ou FormEncode para validadores forma de cadeia para Set e-mail ou terei de escrever meu próprio validador para isso?

Foi útil?

Solução

Eu acho que deveria ser mais parecido com o abaixo. Tem a vantagem de tentar cada e-mail em vez de apenas parando na primeira inválido. Ele também irá adicionar os erros ao estado para que você pudesse dizer quais tinham falhado.

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]

Outras dicas

http://formencode.org/Validator.html

Outra validador notável é formencode.compound.All - este é um validador composto - ou seja, é um validador que leva validadores como entrada. Os esquemas são um exemplo; Neste caso, todos tem uma lista de validadores e aplica-se a cada um deles, por sua vez. formencode.compound.Any é seu complemento, que usa o primeiro validador passagem em sua lista.

O que eu queria era um validador eu poderia apenas ficar em um campo como os validadores de corda e Int. Eu descobri que não havia nenhuma maneira de fazer isso a menos que eu criei o meu próprio validador. Estou postando aqui para sermos mais completos, e para que outros possam beneficiar.

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

Com FormEncode validadores - Tubos e Wrapper, você poderia:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top