簡體   English   中英

Flask 中 WTForm 文件的自定義驗證

[英]Custom validation for WTForm fileds in Flask

我使用了內置的驗證器,但它們都沒有在頁面上打印消息。 另外,我想創建一個自定義驗證器來檢查重復的用戶名。 我寫了function,因為我是初學者,不知道怎么用。 請解決問題。

from flask import Flask, app, render_template, request, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, PasswordField
from wtforms.validators import InputRequired, EqualTo, ValidationError

app = Flask(__name__)

app.config['SECRET_KEY'] = "PQrs12t46uvvrty567"

class MyForm(FlaskForm):
    username = StringField('Username', validators=[InputRequired(message="This field is required.")])
    password=PasswordField('Password', validators=[InputRequired(message=("enter the password"))])
    confirm_password=PasswordField('Confirm Password', validators=[EqualTo('password')])
    submit = SubmitField('Register') 


def isDuplicate():
    appdatabase={"Alis":"Smith","Mike":"Brown","Paul":"Miller"}
    form = MyForm()
    for user in appdatabase:
        if form.username == appdatabase[user]:
            raise ValidationError("Username already exists! Please choose another one.")


@app.route('/')
def base():
    form = MyForm()
    return render_template('customvalidator.html', form = form)

@app.route('/submitform', methods=["GET","POST"])
def submitform():
    form = MyForm()
    if form.validate_on_submit():
        return 'Form accepted successfully.'
    else:
        return 'Incorrect form data'

if __name__=="__main__":
    app.run(debug=True)

HTML 文件

<!DOCTYPE html>
<html>
    <head><title>My website</title></head>
    <body>
        <h1>Registration form</h1>  
        <form action="{{ url_for('submitform') }}" method="post">
            {{ form.csrf_token }}
            {{ form.username.label }} 
            {{ form.username }} 
            <ul> 
                {% for error in form.username.errors %}
                 <li style="color: red;">{{ error }} </li>              
                {% endfor %}
            </ul>
            <br>
            {{ form.password.label }}
            {{ form.password }} <br><br>
            {{ form.confirm_password.label }}
            {{ form.confirm_password }} <br><br>
            {{ form.submit}}
    </form>
      
    </body>
</html>

嘗試將isDuplicate function 更改為:

def isDuplicate(form, field):
    appdatabase={"Alis":"Smith","Mike":"Brown","Paul":"Miller"}
    form = MyForm()
    for user in appdatabase:
        if form.username.data == appdatabase[user]:
            raise ValidationError("Username already exists! Please choose another one.")

請注意向 function 添加的表單和字段參數,以允許將其用作自定義驗證器。 form.username也更改為form.username.data以訪問用戶名字段的數據。 (整個 function 需要在表格之前定義。)
然后,您需要將此自定義驗證器添加到表單中用戶名字段的驗證器列表中,如下所示:

username = StringField('Username', validators=[InputRequired(message="This field is required."),isDuplicate])

通過這些更改,自定義驗證應該可以工作,但我們仍然沒有解決自定義錯誤消息的問題。 為此,請將novalidate屬性添加到 HTML 表單標簽。 添加此項將禁用 forms 上的默認驗證,並允許您顯示自定義消息。

有了這些,我相信由於您處理表單提交的方式,這些消息仍然無法正常工作。 當表單未驗證時,您將希望顯示相同的表單模板,而不是顯示它們是否已提交。

我個人的看法是,合並你的兩個表單路線將是最簡單的選擇。 讓路由定義表單,檢查它何時得到驗證,然后呈現表單模板。 當您只想顯示帶有一些添加錯誤消息的相同模板時,這將使您能夠將所有內容放在一起而不呈現不同的模板。

學分:

暫無
暫無

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

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