2013-01-21 10 views
5

私はwtformsフォームを持つ名フィールドのwtforms SelectFieldの選択の検証を無効にする方法はありますか?

class MyForm(Form): 
    names = SelectField('name', choices=[]) 

選択肢が動的に構築され、AJAX呼び出しによって、テンプレートでレンダリングされます。フォームを提出すると、「有効な選択ではない」という例外が発生します。私はフォームが私の名前フィールドの選択肢を検証することを望んでいません。検証を無効にするにはどうしたらいいですか?

+0

なぜ選択パラメータを追加するのですか?なぜ、 'names = SelectField( 'name')'? –

答えて

1

"フォームで選択肢を検証したくない"と私は思います。実際にはという意味です。後​​で自分自身で行い、フォームが正しく機能するかどうかは疑問です。

あなたは運がいいです!既存のフォームをサブクラス化して、選択肢を動的に追加することができます。

class MyForm(Form): 
    # other fields... 


def some_handler(request): 
    name_choices = build_name_choices() 
    class RealForm(MyForm): 
     names = SelectField('name', choices=name_choices) 

    form = RealForm(request.GET) 
    form.validate() 

これにより、フォームの検証メッセージとエラーメッセージを後で生成するものとマージする際の手間を省くことができます。

+2

著者の質問をあなたのものに置き換えて答えました。私はこの必要もあり、それは間違った前提です。私の必要性は、クライアント上で動的に追加されるオープンな選択肢を持つことです。したがって、サーバー上では不明です。 – Xealot

8

私はWTFormsのSelectMultipleField検証を回避するためにこれを実行しました。それは私が単に組み込みのバリデーションを無効に平野SelectField

class NonValidatingSelectMultipleField(SelectMultipleField): 
    """ 
    Attempt to make an open ended select multiple field that can accept dynamic 
    choices added by the browser. 
    """ 
    def pre_validate(self, form): 
     pass 

と同じように動作するはずです。

+0

これはまさに正しいことです。誰かが興味がある場合は、スキップしているpre_validateコードを以下に示します。 –

+0

これは通常のSelectFieldのものです。これはSelectMultipleFIeldの場合です:def pre_validate(self、form): self.dataの場合: values = list(self.choicesのcの場合はc [0]) のself.dataの場合: dが値にない場合: raise ValueError(self.gettext( "'%(value)s'はこのフィールドの有効な選択肢ではありません))%dict(value = d)) –

関連する問題