Flask-WTF validate_on_submit()未执行

时间:2018-09-27 23:19:02

标签: flask-wtforms

我无法弄清楚为什么我的表格无法通过验证。我已确保将CSRF字段使用form.hidden_tag

插入HTML中

这是我的注册表的代码:

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

3 个答案:

答案 0 :(得分:0)

您的问题来自EqualTo(password)。您应该将它作为字符串而不是Refrence传递。

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

这是因为它在后台检查password.data,而不是密码对象。 这是有关 EqualTo()的更多信息:

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

在wtforms的代码中,它会检查 form.data!= other.data

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

答案 1 :(得分:0)

您只能在密码中加上单引号以解决该问题。

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

答案 2 :(得分:0)

您使用的是类成员密码而不是“字段名”,因此会出现错误。

错误:

EqualTo(password)

正确:

EqualTo('password')

在下面有一个EqualTo的示例 WTForms validators documentation