問題:
TurboGears 2に、電子メールのリスト用のテキストフィールドがあるフォームがあります。ToscaWidgetsまたはFormEncodeを使用してSetとEmailのフォームバリデーターをチェーンする簡単な方法はありますか、それともこれのために独自のバリデーターを作成する必要がありますか?
問題:
TurboGears 2に、電子メールのリスト用のテキストフィールドがあるフォームがあります。ToscaWidgetsまたはFormEncodeを使用してSetとEmailのフォームバリデーターをチェーンする簡単な方法はありますか、それともこれのために独自のバリデーターを作成する必要がありますか?
http://formencode.org/Validator.htmlから
もう1つの注目すべきバリデーターは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バリデーター(パイプとラッパー)を使用すると、次のことができます。
from formencode import validators, compound
compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
validators.Email())