Question

Problème:

J'ai une forme TurboGears 2 qui a un champ de texte pour une liste des e-mails. Est-il un moyen simple en utilisant ToscaWidgets ou FormEncode pour former la chaîne validateurs pour Set et e-mail ou devrai-je écrire mon propre validateur pour cela?

Était-ce utile?

La solution

Je pense qu'il devrait être plus comme ci-dessous. Il a l'avantage d'essayer chaque e-mail au lieu d'arrêter au premier invalide. Il ajoutera également les erreurs à l'état pour que vous puissiez dire ceux qui avaient échoué.

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]

Autres conseils

http://formencode.org/Validator.html

Une autre validateur notable est formencode.compound.All - c'est un composé validateur - qui est, il est un validateur qui prend validateurs comme entrée. Les schémas sont un exemple; dans ce cas Tous prend une liste de validateurs et applique chacun d'eux à son tour. formencode.compound.Any est son complément, qui utilise le premier validateur de passage dans sa liste.

Ce que je voulais était un validateur je pouvais coller dans un champ comme la chaîne et Int validateurs. Je trouvais qu'il n'y avait pas moyen de le faire à moins que je créé mon propre validateur. Je poste ici par souci d'exhaustivité, et pour que les autres puissent en bénéficier.

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 validateurs - Pipe et Wrapper, vous pourrait:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top