Chain FormEncode验证器

时间:2009-07-15 14:56:31

标签: python widget turbogears formencode toscawidgets

问题:

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分: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]

答案 3 :(得分:0)

使用FormEncode validators - 管道和包装器,你可以:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())