簡體   English   中英

鏈式表單編碼驗證器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM