Сообщение не мигает на некоторых методах проверки WTForm - PullRequest
0 голосов
/ 30 октября 2018

Этот вопрос относится к этому вопросу , но фокусируется на одной из основных проблем, о которых я не знал, когда задавал этот другой вопрос.

Я использую Python, Flask и WTForms для создания формы. Вот этот питон:

from flask import render_template
from flask_wtf import FlaskForm
from wtforms import DecimalField, SubmitField
from wtforms.validators import NumberRange, DataRequired

class NumberForm(FlaskForm):
    question_one = DecimalField('Question 1', validators=[NumberRange(min=0, max=10)])
    question_two = DecimalField('Question 2', validators=[DataRequired()])
    submit = SubmitField('Submit')

@app.route('some_route/', methods=['GET', 'POST'])
def page():
    form = NumberForm()
    if form.validate_on_submit():
        return some_success_or_other
    return render_template('page.html', form=form)

И HTML:

<form method="POST">
  <div class="form-group-row">
    {{ form.hidden_tag() }}
    {{ form.question_one.label }}
    <div>
      {{ form.question_one }}
    </div>
  </div>
  <div class="form-group-row">
    {{ form.question_two.label }}
    <div>
      {{ form.question_two }}
    </div>
  </div>
  <div class="form-group-row">
    {{ form.submit }}
  </div>
</form>

Два используемых мной валидатора (NumberRange и DataRequired) ведут себя по-разному. Если данные не введены в поле 2 и нажата кнопка отправки, форма не отправляется, а рядом с полем появляется сообщение об ошибке «Пожалуйста, заполните это поле».

Если в поле 1 представлены строки (а не десятичные дроби) или числа вне диапазона, форма отправляется при нажатии кнопки.
Хотя ошибка регистрируется (и может быть показана с помощью {{ form.errors }}, я хотел, чтобы для обоих валидаторов было одинаковое поведение - я бы хотел, чтобы форма не отправлялась при вводе недопустимых чисел / строк в поле 1.

Кто-нибудь знает, почему валидаторы ведут себя по-разному?

1 Ответ

0 голосов
/ 31 октября 2018

HTML5 вводит атрибут required , который делает обязательным заполнение поля и проверку блочной формы, если одно из полей (затронутых этим атрибутом) не заполнено; этот атрибут доступен только для входного тега.

При использовании flask-wtf при использовании поля с валидатором required оно автоматически создает поле html с обязательным атрибутом, которое блокирует отправку формы и отображает инфобулю.

В случае других валидаторов, таких как NumberRange, это не то же самое.

С чистым HTML:

для того же поведения, то есть для проверки того, что введенный номер находится в четко определенном диапазоне, и для блокировки отправки формы, если это не так, необходимо использовать шаблон атрибут (подробнее здесь ). Для этого конкретного случая не существует предопределенного шаблона, поэтому вам нужно будет создать собственный шаблон с использованием регулярных выражений . Это даст: <input type="text" pattern="[0-9]">.

Теперь нам просто нужно повторно использовать ту же логику с помощью wtforms ...

С массой:

<form method="POST">
    <div class="form-group-row">
        {{ form.hidden_tag() }}
        {{ form.question_one.label }}
        <div>
            {{ form.question_one(pattern="[0-9]") }}
        </div>
    </div>
    <div class="form-group-row">
        {{ form.question_two.label }}
        <div>
            {{ form.question_two }}
        </div>
    </div>
    <div class="form-group-row">
        {{ form.submit }}
    </div>
</form>

В строке {{ form.question_one(pattern="[0-9]") }} я использую атрибут pattern с регулярным выражением, которое проверяет, что введенное число находится в диапазоне от 0 до 9. Для больших диапазонов вам потребуется написать регулярные выражения немного более сложными ( эта ссылка интересна)

...