链式FormEncode验证器
问题:
我在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]