Функция FlaskForm validate_on_submit всегда возвращает False - PullRequest
0 голосов
/ 17 июня 2020

Вот мой код:

        # My Form
from flask_wtf import FlaskForm
from wtforms.validators import Length, InputRequired
from wtforms import StringField, SubmitField

class AddGradeForm(FlaskForm):
        name = StringField('Grade', validators=[InputRequired(), Length(min=4, max=20)])
        submit = SubmitField('Add')

 # My route
    @admin.route('/AddGrade', methods=['GET', 'POST']) # admin is my blueprint's name
    def add_grade():
        form = AddGradeForm()
        if form.is_submitted():
            return str(form.validate_on_submit()) # always returns False
             ...
            flash('New grade has been added', 'success')
            return redirect(url_for('grades'))
        return render_template('add_grade.html', form=form)
# Template
<form method="POST" action="">
                        {{ form.hidden_tag() }}
                            <!-- Second row -->
                            <div class="row">
                                <div class="col-12">
                                    <div class="form-group">
                                        {{ form.name.label(class="form-control-label") }}
                                        {% if form.name.errors %}
                                        {{ form.name(class="form-control is-invalid") }}
                                        <div class="invalid-feedback">
                                            {% for error in form.name.errors %}
                                            <span>{{ error }}</span>
                                            {% endfor %}
                                        </div>
                                        {% else %}
                                        {{ form.name(class="form-control") }}
                                        {% endif %}
                                    </div>
                                </div>
                            </div>

                            <div class="input-group mb-35  " style="vertical-align: middle;">
                                {{ form.submit(class="btn btn-outline-primary btn-block") }}
                            </div>
                        </form>

На моем локальном сервере validate_on_submit () работает точно так, как я ожидал, но на рабочем сервере функция validation_on_submit всегда возвращает False (снова перенаправляет на форму с нет ошибки проверки) Не знаю почему!?. Пожалуйста, помогите мне выяснить эту ошибку. Я пробовал много попыток, но не нашел решения.

1 Ответ

0 голосов
/ 19 июня 2020

Я видел ту же ошибку, это сработало для меня:

Форма

Использовать форму вместо FlaskForm

Маршрут

  • Использовать круглые скобки () вместо скобок [] при предоставлении разрешенных методов
  • Чтобы проверить, отправлена ​​ли форма и подтверждена ли она, используйте: request.method == 'P0ST' и form.validate () вместо form.validate_on_submit () потому что мы больше не используем FlaskForm

Template

Удалите form.hidden_tag и вместо него используйте form.csrf.token

Вот код с изменениями выше:

# My Form
from wtforms import Form,StringField, SubmitField, validators

class AddGradeForm(Form):  # replaced FlaskForm with Form
        name = StringField('Grade',[validators.InputRequired(), validators.Length(min=4, max=20)])
        submit = SubmitField('Add')

 # My route
    @admin.route('/AddGrade', methods=('GET', 'POST')) # change from [] to ()
    def add_grade():
        form = AddGradeForm()
        if request.method == 'POST' and form.validate():
            return str(form.validate_on_submit()) # now returns True
             ...
            flash('New grade has been added', 'success')
            return redirect(url_for('grades'))
        return render_template('add_grade.html', form=form)
# Template
<form method="POST" action="">
                        {{ form.csrf_token }} <!-- from form.hidden_tag() to form.csrf_token -->
                            <div class="row">
                                <div class="col-12">
                                    <div class="form-group">
                                        {{ form.name.label(class="form-control-label") }}
                                        {% if form.name.errors %}
                                        {{ form.name(class="form-control is-invalid") }}
                                        <div class="invalid-feedback">
                                            {% for error in form.name.errors %}
                                            <span>{{ error }}</span>
                                            {% endfor %}
                                        </div>
                                        {% else %}
                                        {{ form.name(class="form-control") }}
                                        {% endif %}
                                    </div>
                                </div>
                            </div>

                            <div class="input-group mb-35  " style="vertical-align: middle;">
                                {{ form.submit(class="btn btn-outline-primary btn-block") }}
                            </div>
</form>
...