2011-12-09 5 views
8

Sto utilizzando un validatore personalizzato per verificare che un campo non sia vuoto se una casella di controllo è selezionata. Controlla correttamente ma a prescindere sempre convalida sempre se il valore è un numero.Può wtforms validatore personalizzato rendere un campo facoltativo?

Fondamentalmente ho bisogno di un campo per interrompere la convalida in determinate condizioni del modulo.

Esiste un modo per il validatore personalizzato di interrompere la convalida sul campo?

+0

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

risposta

12

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.

+0

[Documenti per validatori personalizzati] (http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) come riferimento. – JaySeeAre