链式FormEncode验证器

0 投票
4 回答
1969 浏览
提问于 2025-04-15 12:55

问题:

我在TurboGears 2中有一个表单,里面有一个文本框用来输入一系列的电子邮件地址。请问有没有简单的方法可以使用ToscaWidgets或FormEncode来连接表单的验证器,确保输入的是集合和电子邮件格式?还是说我需要自己写一个验证器呢?

4 个回答

0

我想要的是一个可以直接放到字段里的验证器,就像字符串和整数的验证器那样。结果我发现,如果不自己创建一个验证器,是没办法做到的。所以我把这个内容发在这里,既是为了完整性,也希望其他人能从中受益。

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
1

来自 http://formencode.org/Validator.html

另一个值得注意的验证器是 formencode.compound.All——这是一个复合验证器,也就是说,它可以接受其他验证器作为输入。模式就是一个例子;在这种情况下,All 会接收一系列验证器,并依次应用每一个。formencode.compound.Any 则是它的对立面,它会使用列表中第一个通过的验证器。

0

我觉得应该像下面这样做。这种方法的好处是会尝试每一个邮箱,而不是在遇到第一个无效的邮箱时就停止。这样还可以把错误记录下来,这样你就能知道哪些邮箱是失败的。

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]

撰写回答