Flask-WTF validate_on_submit () не выполняется - PullRequest
0 голосов
/ 28 сентября 2018

Я не могу понять, почему моя форма не будет проверена.Я удостоверился, что поле CSRF вставлено в HTML с form.hidden_tag

Вот код моей регистрационной формы:

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired, Length, Email, EqualTo


class RegistrationForm(FlaskForm):
    username = StringField('Username', validators=[DataRequired(), Length(min=2, max=20)])
    email = StringField('Email', validators=[DataRequired(), Email()])
    password = PasswordField('Password', validators=[DataRequired()])
    confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo(password)])
    submit = SubmitField('Register')

Вот функция, в которой я нахожусьпроверка, проверена ли форма.Он отправляет, поскольку программа выводит «отправлено» в мой терминал

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()
    if form.is_submitted():
        print("submitted")
    if form.validate_on_submit():
        flash(f'Account created for {form.username.data}!', 'success')
        return redirect(url_for('home'))
    print(forms.errors)
    return render_template('register.html', title='Register', form=form)

Используя forms.errors, я получаю следующее сообщение об ошибке:

{'confirm_password': ["Invalid field name '<UnboundField(PasswordField, ('Password',), {'validators': [<wtforms.validators.DataRequired object at 0x00000205913D2F28>]})>'."]}

Я не уверен в том, чтоэто значит.

Если это поможет, у меня весь текущий код расположен на GitHub: https://github.com/tomajohnson21/FakeBook

Ответы [ 2 ]

0 голосов
/ 13 января 2019

Вы можете поставить только одинарные кавычки на пароль, чтобы решить его.

confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])
0 голосов
/ 18 октября 2018

Ваша проблема исходит от EqualTo(password).Вы должны были передать его как строку, а не как ссылку.

confirm_password = PasswordField('Confirm Password', validators=[DataRequired(), EqualTo('password')])

Это потому, что в фоновом режиме он проверяет password.data, а не пароль Object.Вот больше информации о EqualTo () :

https://wtforms.readthedocs.io/en/stable/validators.html#wtforms.validators.EqualTo

И в коде на wtforms он проверяет form.data! = Other.данные :

https://github.com/wtforms/wtforms/blob/283b2803206825158834f1828bbf749c129b7c47/src/wtforms/validators.py#L72

...