2011-12-09 4 views
8

カスタムバリデータを使用して、チェックボックスをオンにするとフィールドが空でないことを確認しています。それは正しくチェックしますが、値が数値であるかどうかは常に検証されます。カスタムバリデータを作成することで、フィールドをオプションにすることができますか?

基本的には、フォームの特定の条件で検証を停止するフィールドが必要です。

カスタムバリデーターがフィールドの検証を停止する方法はありますか?

+0

[WTFormsで条件付きオプションのフィールドを作成する方法](http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-オプション - インフォメーション) – nsfyn55

答えて

12

はい、カスタムバリデーターは、組み込みのオプションおよび必須バリデーターと同様に、検証フローを制御できます。検証フローを制御するには、StopValidation例外を使用します。それ以上の検証は実行されません。

メッセージでStopValidationを発生させた場合、それはエラーリストに追加されます。そうでない場合、メッセージがない場合、エラーはそれ以上追加されません。

IntegerField、FloatFieldなどを使用している場合は、入力強制時に発生する「処理エラー」も覚えておく必要があります。 Optionalバリデーターがこれを処理する方法は、入力が空の場合に以前のすべてのエラーをクリアします。ちょうどwtforms/fields.pyから任意のバリデータのコードを簡単に見てみましょう:

if not field.raw_data or isinstance(field.raw_data[0], basestring) and not field.raw_data[0].strip(): 
    field.errors[:] = [] 
    raise StopValidation() 

あなたは何も入力または空白の入力がない場合はそれがないものの一つを見ることができるように、それがクリアされますです以前のエラーを取り除きます。

したがって、カスタムバリデーターの作成方法を考えてみましょう。

from wtforms.validators import StopValidation 

def myvalidator(form, field): 
    if not form.some_checkbox_field.data: 
     # clear out processing errors 
     field.errors[:] = [] 
     # Stop further validators running 
     raise StopValidation() 

あなたはそのようなようなあなたのバリデータを使用できます。チェックボックスがチェックされている場合

from wtforms import BooleanField, IntegerField, Form, validators as v 

class SomeForm(Form): 
    some_checkbox_field = BooleanField('Enable MyNumber') 
    mynumber = IntegerField('', [myvalidator, v.NumberRange(min=5, max=50)]) 

それでは、それは、入力されたとしてmynumberが多数あったことを検証します。さらに、NumberRangeバリデーターが実行されます。チェックされていない場合、エラーはクリアされ、StopValidationはNumberRangeの実行を妨げます。

+0

[カスタムバリデータのドキュメント](http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators)を参照してください。 – JaySeeAre

関連する問題