0

问题:

我在 TurboGears 2 中有一个表单,其中有一个用于电子邮件列表的文本字段。有没有一种简单的方法使用 ToscaWidgets 或 FormEncode 为 Set 和 Email 链接表单验证器,还是我必须为此编写自己的验证器?

4

4 回答 4

1

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

另一个值得注意的验证器是formencode.compound.All——这是一个复合验证器——也就是说,它是将验证器作为输入的验证器。模式就是一个例子;在这种情况下,All 获取一个验证器列表并依次应用它们中的每一个。formencode.compound.Any 是它的补充,它使用列表中第一个通过的验证器。

于 2010-10-18T19:57:32.377 回答
0

我想要的是一个验证器,我可以只插入一个像 String 和 Int 验证器这样的字段。我发现除非我创建自己的验证器,否则无法做到这一点。为了完整起见,我将其发布在这里,以便其他人受益。

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
于 2009-07-15T19:12:58.117 回答
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]
于 2009-07-15T23:00:11.387 回答
0

使用FormEncode 验证器- Pipe 和 Wrapper,您可以:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())
于 2016-11-21T13:51:15.623 回答