Sì, i validatori personalizzati possono controllare il flusso di convalida come i validatori integrati facoltativi e richiesti. Per controllare il flusso di convalida, si utilizza l'eccezione StopValidation
e non verrà eseguita alcuna ulteriore convalida.
Se StopValidation viene generato con un messaggio, verrà aggiunto all'elenco degli errori, altrimenti se non ci sono messaggi, non verranno aggiunti altri errori.
Se si utilizza, ad esempio, IntegerField, FloatField, ecc., È necessario tenere presente anche gli "errori di elaborazione" che si verificano al momento della coercizione in ingresso. Il modo in cui il validatore opzionale gestisce ciò è che cancella tutti gli errori precedenti se l'input è vuoto. Diciamo solo un'occhiata veloce al codice per il validatore opzionale da 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()
Come si può vedere una delle cose che fa se non v'è alcun ingresso o ingresso vuoto, è sarà chiaro eventuali errori precedenti.
Quindi, veniamo al modo in cui è possibile eseguire il validatore personalizzato.
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()
È quindi possibile utilizzare il validatore, come ad esempio:
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)])
Allora, se la casella è selezionata, sarà convalidare che myNumber era un numero come immesso. Inoltre, verrà eseguito il validatore NumberRange. Se non selezionato, gli errori verranno cancellati e StopValidation impedirà il funzionamento di NumberRange.
possibile duplicato di [Come rendere un campo condizionalmente facoltativo in WTForms?] (Http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55