问题:
我在TurboGears 2中有一个表单,其中包含一个电子邮件列表的文本字段。是否有一种简单的方法使用ToscaWidgets或FormEncode链接表格和电子邮件的表单验证器,或者我是否必须为此编写自己的验证器?
答案 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())