2009-07-15 9 views
0

問題:チェーンFormEncodeバリ

私は電子メールのリストのためのテキストフィールドを持つTurboGearsの2のフォームを持っています。 ToscaWidgetsやFormEncodeを使用してSetとEmailのフォームバリデーターを連鎖させる簡単な方法はありますか?それとも自分のバリデーターを書く必要がありますか?

答えて

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] 
+0

興味深い、私はアップグレードが好き。 – Robbie

+0

13行目に値を割り当てます。 values = validator.to_python(values、state) – Robbie

0

私が望んだのは、StringとIntバリデータのようなフィールドにちょうど固執できるバリデータでした。自分のバリデーターを作成しない限り、これを行う方法がないことがわかりました。私は完全性のためにここにそれを掲示しているので、他の人が利益を得ることができます。

​​
1

http://formencode.org/Validator.html

からもう一つの注目すべきバリデータはformencode.compound.Allある - これは、化合物のバリである - つまり、それは、入力としてバリを取るバリデータです。スキーマは一例です。この場合、Allはバリデータのリストを取り、それぞれを順番に適用します。 formencode.compound.Anyは、最初の渡しバリデーターをそのリストに使用する補足です。 FormEncode validators

0

- パイプとラッパー、あなたはできます

from formencode import validators, compound 


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')), 
       validators.Email())