问题:
我在 TurboGears 2 中有一个表单,其中有一个用于电子邮件列表的文本字段。有没有一种简单的方法使用 ToscaWidgets 或 FormEncode 为 Set 和 Email 链接表单验证器,还是我必须为此编写自己的验证器?
问题:
我在 TurboGears 2 中有一个表单,其中有一个用于电子邮件列表的文本字段。有没有一种简单的方法使用 ToscaWidgets 或 FormEncode 为 Set 和 Email 链接表单验证器,还是我必须为此编写自己的验证器?
来自http://formencode.org/Validator.html
另一个值得注意的验证器是formencode.compound.All——这是一个复合验证器——也就是说,它是将验证器作为输入的验证器。模式就是一个例子;在这种情况下,All 获取一个验证器列表并依次应用它们中的每一个。formencode.compound.Any 是它的补充,它使用列表中第一个通过的验证器。
我想要的是一个验证器,我可以只插入一个像 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
我认为它应该更像下面。它的优点是尝试每封电子邮件,而不是仅仅停留在第一个无效的地方。它还将错误添加到状态中,以便您可以判断哪些错误已失败。
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]
使用FormEncode 验证器- Pipe 和 Wrapper,您可以:
from formencode import validators, compound
compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
validators.Email())