@zlodiak

Почему форма не валидна?

Есть обычная форма. У меня не получается после её сабмита проверить её валидность. Помогите пожалуйста разобраться.

класс формы:
class SearchForm(FlaskForm):
    searcher = SelectField(
        'Поисковик', 
        choices=[(item.id, item.searcher) for item in Searcher.query.all()],
        validators=[DataRequired()]
    )
    query = StringField('Запрос', validators=[DataRequired()])
    submit = SubmitField('Найти')


соответствующая разметка:
{% extends "base.html" %}

{% block content %}
    <form action="/search" method="POST" novalidate>
        {{ search_form.hidden_tag() }}

        <div>
            {{ search_form.searcher }}
            {{ search_form.query(size=32) }}
            {{ search_form.submit() }}
        </div>
    </form>
{% endblock %}


После сабмита в отладчике хрома видно, что уходит POST-запрос с заполненными значениями query, searcher, csrf_token. Код возврата 200

роут:
@app.route('/', methods=['GET', 'POST'])
@app.route('/search', methods=['GET', 'POST'])
def search():
    print(request.form)
    search_form = SearchForm()
    if request.method == 'POST' and search_form.validate_on_submit():
        print('form is valid')
    else:
        print('form is not valid')
    return render_template('search.html', title='Поиск', search_form=search_form)


Проблема видна в выводе консоли:
flask run
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
ImmutableMultiDict([])
form is not valid
127.0.0.1 - - [23/Apr/2019 10:01:50] "GET /search HTTP/1.1" 200 -
ImmutableMultiDict([('submit', 'Найти'), ('searcher', '1'), ('query', 'gg'), ('csrf_token', 'ImFiMzFjM2IzOWJlNTU2YjBlYjcxNzA3MTUyYzMxZGUwYzdmNTk5YjQi.XL64Xg.EYYAUzvlpnlYScpPqt5Z8xXVvUg')])
form is not valid
127.0.0.1 - - [23/Apr/2019 10:01:53] "POST /search HTTP/1.1" 200 -


Видно, что первый раз(когда форма отрисовывается), выводится "form is not valid". А после сабмита роут снова выводит "form is not valid", хотя при этом форма валидна и есть csrf-токен

Полный код здесь
  • Вопрос задан
  • 723 просмотра
Решения вопроса 1
@pcdesign
if request.method == 'POST' and search_form.validate_on_submit():


Из-за этой строки.
Если запрос не POST, а GET то каждый раз будем получить 'form is not valid'

Должно быть что-то вроде этого:
if request.method == 'POST':
    if search_form.validate_on_submit():
        print('form is valid')
    else:
        print('form is not valid')


А так же попробуйте так добавить str:
choices=[(str(item.id), item.searcher) for item in Searcher.query.all()]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы