[英]Chain FormEncode Validators
問題:
我在TurboGears 2中有一個表單,該表單具有用於電子郵件列表的文本字段。 有沒有一種簡單的方法可以使用ToscaWidgets或FormEncode鏈接Set和Email的表單驗證器,還是我需要為此編寫自己的驗證器?
來自http://formencode.org/Validator.html
另一個值得注意的驗證器是formencode.compound.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 and Wrapper,您可以:
from formencode import validators, compound
compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
validators.Email())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.