簡體   English   中英

Flask WTForm 未驗證,未報告表單錯誤

[英]Flask WTForm not validating, no form errors reported

我正在嘗試使用由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()總是失敗。 我無法理解的是,即使我嘗試打印數組錯誤,也沒有顯示錯誤。

我錯過了什么?

這里有幾個問題。 首先,在您的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')])

最后,在您的燒瓶中,我們需要接受對視圖的POST請求。 這可以通過改變@app.route()來完成:

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

進行這些更改后,表單應該可以按預期工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM