質問

問題:

TurboGears 2 には、電子メールのリスト用のテキスト フィールドがあるフォームがあります。ToscaWidgets または FormEncode を使用して Set と Email のフォーム バリデータをチェーンする簡単な方法はありますか、それとも独自のバリデータを作成する必要がありますか?

役に立ちましたか?

解決

私はそれがより以下のようにするべきだと思います。これは、各電子メールをしようとするだけではなく最初の無効で停止するという利点があります。あなたはどれが失敗していたどの言うことができるので、それはまたの状態にエラーを追加します。

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]

他のヒント

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

FormEncodeバリの - パイプとラッパーます、可能性:

from formencode import validators, compound


compound.Pipe(validators.Wrapper(to_python=lambda v: v.split(',')),
              validators.Email())
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top