Как создать пользовательский валидатор, который может разрешить значения 0 или «falsey» в поле с ограничением Optional () Flask -WTForms? - PullRequest
0 голосов
/ 16 февраля 2020

Я создал форму, в которой есть все необязательные поля для редактирования записи, и те поля, в которых есть данные, обновляются, а остальные остаются прежними. Для FloatFields он интерпретирует 0 как пустую от данных.

В настоящее время я использую маршрут для решения этой проблемы:

        if form.amount.raw_data[0] == '0':
            new_amount = 0
        else:
            new_amount = form.amount.data if form.amount.data else previous_record.amount

Я чувствую себя более программистом c Решением будет создание пользовательского валидатора, который интерпретирует 0 как фактические данные. Я попробовал это здесь:

class OptionalZeroAllowed(object):
    """
    Allows empty input and stops the validation chain from continuing.
    If input is empty, also removes prior errors (such as processing errors)
    from the field.
    :param strip_whitespace:
        If True (the default) also stop the validation chain on input which
        consists of only whitespace.
    Also interprets 0 as actual data.
    """

    field_flags = ("optional",)

    def __init__(self, strip_whitespace=True):
        if strip_whitespace:
            self.string_check = lambda s: s.strip()
        else:
            self.string_check = lambda s: s

    def __call__(self, form, field):
        if field.raw_data[0] == '0':
            field.data = 0
        elif (
            not field.raw_data
            or isinstance(field.raw_data[0], string_types)
            and not self.string_check(field.raw_data[0])
        ):
            field.errors[:] = []
            raise StopValidation()

Не уверен, почему ручная установка form.data на 0 не работает, но был бы признателен за помощь в понимании / поиске лучшего решения.

Спасибо !

...