Может ли пользовательский валидатор wtforms сделать поле необязательным? - PullRequest
8 голосов
/ 09 декабря 2011

Я использую специальный валидатор, чтобы проверить, не является ли поле пустым, если установлен флажок.Он проверяет правильно, но, тем не менее, всегда проверяет, является ли значение числом.

В основном мне нужно поле, чтобы остановить проверку при определенных условиях формы.

Есть ли способ для пользовательского средства проверки остановить проверку на поле?

1 Ответ

13 голосов
/ 09 декабря 2011

Да, пользовательские валидаторы могут управлять потоком валидации точно так же, как встроенные необязательные и обязательные валидаторы.Для управления потоком проверки вы используете исключение StopValidation, и дальнейшая проверка не будет выполняться.

Если StopValidation вызывается с сообщением, оно будет добавлено в список ошибок, в противном случае, если нетсообщение, больше ошибок не будет добавлено.

Если вы используете, скажем, IntegerField, FloatField и т. д., вы также должны помнить об «ошибках обработки», которые возникают во время приведения ввода.Способ, которым необязательный валидатор обрабатывает это, очищает все предыдущие ошибки, если ввод пуст.Давайте просто кратко рассмотрим код для Необязательного валидатора из 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.

...