2011-12-09 21 views
8

Estoy usando un validador personalizado para verificar que un campo no esté vacío si se marca una casilla de verificación. Comprueba correctamente, pero independientemente de ello, siempre sigue validando si el valor es un número.¿Puede el validador personalizado hacer que un campo sea opcional?

Básicamente necesito un campo para detener la validación bajo ciertas condiciones del formulario.

¿Hay alguna manera para que el validador personalizado detenga la validación en el campo?

+0

posible duplicado de [¿Cómo hacer un campo condicionalmente opcional en WTForms?] (Http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55

Respuesta

12

Sí, los validadores personalizados pueden controlar el flujo de validación al igual que los validadores Opcional y Requerido incorporados. Para controlar el flujo de validación, utiliza la excepción StopValidation, y no se realizará ninguna otra validación.

Si StopValidation aparece con un mensaje, se agregará a la lista de errores; de lo contrario, si no hay ningún mensaje, no se agregarán más errores.

Si está utilizando, por ejemplo, IntegerField, FloatField, etc., también debe tener en cuenta los "errores de procesamiento" que se producen en el momento de la coerción de entrada. La forma en que el validador opcional maneja esto es borra todos los errores previos si la entrada está vacía. Vamos a echar un vistazo rápido en el código para la validación opcional de 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() 

Como se puede ver una de las cosas que hace si no hay entrada o entrada en blanco, es claro que se cualquier error anterior.

Entonces, vamos a ver cómo podría hacer su validador personalizado.

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() 

A continuación, puede utilizar el validador como tales:

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)]) 

Así pues, si se marca la casilla de verificación, se validará que myNumber era un número como introducido. Además, se ejecutará el validador NumberRange. Si no se verifica, los errores se borrarán, y StopValidation evitará que se ejecute NumberRange.

+0

[Documentos para validadores personalizados] (http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) como referencia. – JaySeeAre

Cuestiones relacionadas