【问题标题】:Flask WTForm not validating, no form errors reportedFlask WTForm 未验证,未报告表单错误
【发布时间】:2020-05-16 15:20:32
【问题描述】:

我正在尝试使用一些由 flask-WTF 表单控制的基本登录/注册系统来设置一个 flask webapp。

这是我的代码:

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)])

烧瓶

@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() 总是失败。 我无法理解的是,即使我尝试打印数组错误,也没有显示错误。

我错过了什么?

【问题讨论】:

    标签: python html forms flask-wtforms wtforms


    【解决方案1】:

    这里有几个问题。首先,在您的 html 中,您没有为表单设置method 属性。这意味着它默认为GET,这就是表单不验证的原因。可以这样更改:

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

    顺便说一句,由于加载表单的视图与目标相同,您可以省略 action 属性,给我们:

    <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'])
    

    进行这些更改后,表单应该可以按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-07
      • 1970-01-01
      • 2018-04-19
      • 2014-02-20
      相关资源
      最近更新 更多