繁体   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