Flask WTForm не проверяется, нет ошибок в форме - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь настроить flask веб-приложение с некоторой базовой c системой входа / регистрации, управляемой flask -WTF формами.

Вот мой код:

html

<!-- Register form -->
<div class="form">
    <div class="form-area">
        <h2>Register</h2>
        <form action="{{ url_for('register') }}">
            {{ form.csrf_token() }}
            {{ form.hidden_tag() }}
            {{ form.name(placeholder='name') }}
            {{ form.surname(placeholder='surname') }}
            {{ form.email(placeholder='email') }}
            {{ form.password(placeholder='password') }}
            {{ form.confirm_password(placeholder='confirm password') }}
            <input type="submit" value="Register">
        </form>
        <p>Already registered?<a href="{{ url_for('login') }}"> Log in here</a></p>
    </div>
    <div class="error-area">
        {% for error in form.confirm_password.errors %}
        <p>{{ error }}</p>
        {% endfor %}
    </div>
</div>

класс

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField
from wtforms.validators import InputRequired, Length, EqualTo

class RegisterForm(FlaskForm):
    name = StringField('name', validators=[InputRequired()])
    surname = StringField('surname', validators=[InputRequired()])
    email = StringField('email', validators=[InputRequired()])
    password = PasswordField('password', validators=[InputRequired(), Length(min=6)])
    confirm_password = PasswordField('confirm passord', validators=[InputRequired(), Length(min=6), EqualTo(password)])

flask

@app.route('/register')
def register():

    #declare a register form
    form = RegisterForm()

    #validate form
    if form.validate_on_submit():
        print('validate')
        return '<h1>Success</h1>'
    else:
        print('not validated')
        print(form.errors)

    return render_template('register.html', form=form)

Проблема с моим кодом в том, что проверка не работает. Даже если я заполняю форму с «действительным» вводом, form.validate_on_submit() всегда терпит неудачу. Чего я не могу понять, так это того, что даже когда я пытаюсь распечатать ошибки массива, ошибки не отображаются.

Чего мне не хватает?

1 Ответ

0 голосов
/ 06 февраля 2020

Здесь есть несколько вопросов. Во-первых, в вашем html вы не установили атрибут method для формы. Это означает, что по умолчанию GET, поэтому форма не проверяется. Это можно изменить следующим образом:

<form action="{{ url_for('register') }}" method='POST'>

Кстати, поскольку представление, загружающее форму, совпадает с целью, вы можете не указывать атрибут действия, давая нам:

<form method='POST'>

Во-вторых, в вашем классе у вас есть пара проблем с полем confirm_password. Во-первых, у вас есть опечатка в PasswordField('confirm passord'. Во-вторых, валидатор EqualTo() ожидает строку, а не поле. Нам нужно полностью изменить эту строку на:

confirm_password = PasswordField('confirm password', validators=[InputRequired(), Length(min=6), EqualTo('password')])

Наконец, в ваших flask нам нужно принять POST запросов к представлению. Это можно сделать, изменив @app.route():

@app.route('/register', methods=['POST', 'GET'])

После внесения этих изменений форма должна работать как положено.

...