Я видел ту же ошибку, это сработало для меня:
Форма
Использовать форму вместо 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>