2011-12-09 11 views
8

Używam sprawdzania poprawności, aby sprawdzić, czy pole nie jest puste, jeśli pole wyboru jest zaznaczone. Sprawdza się poprawnie, ale niezależnie od tego zawsze nadal sprawdza poprawność, czy wartość jest liczbą.Czy wtyczka pozwala na niestandardowe sprawdzanie poprawności, czy pole jest opcjonalne?

Zasadniczo potrzebuję pola do zatrzymania sprawdzania poprawności pod pewnymi warunkami formularza.

Czy istnieje sposób, aby niestandardowy weryfikator zatrzymał sprawdzanie poprawności na tym polu?

+0

możliwy duplikat [Jak zrobić pole warunkowo opcjonalne w WTForms?] (Http://stackoverflow.com/questions/8463209/how-to-make-a-field-conditionally-optional-in-wtforms) – nsfyn55

Odpowiedz

12

Tak, niestandardowe weryfikatory mogą kontrolować przepływ sprawdzania poprawności, podobnie jak wbudowane opcjonalne i wymagane weryfikatory. Aby kontrolować przepływ sprawdzania poprawności, należy użyć wyjątku StopValidation i dalsze sprawdzanie nie zostanie wykonane.

Jeśli komunikat StopValidation zostanie podniesiony, zostanie dodany do listy błędów, w przeciwnym razie, jeśli nie ma komunikatu, nie będzie więcej błędów.

Jeśli używasz, powiedzmy, IntegerField, FloatField, itp., Musisz również pamiętać o "błędach przetwarzania", które występują w czasie przymusu. Sposób, w jaki obsługuje to opcjonalny moduł sprawdzania poprawności, powoduje wyczyszczenie wszystkich poprzednich błędów, jeśli dane wejściowe są puste. Weźmy po prostu rzucić okiem na kod dla opcjonalnego walidator z 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() 

Jak widać jedna z rzeczy robi, jeśli nie ma sygnału wejściowego lub puste, to będzie to wyczyścić wszelkie wcześniejsze błędy.

Wyjaśnimy więc, w jaki sposób można wykonać własny weryfikator.

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

Następnie można używać walidatora takie jak:

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

Tak więc, jeśli pole jest zaznaczone, to potwierdzić, że MyNumber był wprowadzany jako liczba. Dodatkowo uruchomiony zostanie walidator NumberRange. Jeśli nie jest zaznaczone, błędy zostaną usunięte, a funkcja StopValidation uniemożliwi działanie funkcji NumberRange.

+0

[Dokumenty do niestandardowych weryfikatorów] (http://wtforms.readthedocs.io/en/latest/validators.html#custom-validators) w celach informacyjnych. – JaySeeAre

Powiązane problemy