flask表单Flask-WTF

本文介绍如何在Flask应用中使用Flask-WTF扩展创建表单,包括安装、表单类构建、路由函数定义及表单验证,同时提供了一个完整的注册表单示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装flask-wtf

pip3 install flask-wtf -i https://pypi.douban.com/simple 

表单使用三步骤:

一:构建表单类

from wtforms import SubmitField, StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo

#  创建表单类
class RegistForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired("用户名不能为空")])
    pwd = PasswordField('密码', validators=[DataRequired('密码不能为空')])
    pwd2 = PasswordField('重复密码', validators=[DataRequired('密码不能为空'), EqualTo('pwd', '两次密码不一致')])
    submit = SubmitField('注册')

二:定义路由函数,生成表单对象,获取表单数据,进行表单验证

# 定义路由函数,生成表单
@app.route('/regist', methods=['GET', 'POST'])
def regist():
    # 创建表单对象,如果式post提交,前端发送的数据会保存在该表单对象
    form = RegistForm()
    # 判断表单字段是否合理,只有当所有验证通过,form.validate_on_submit才返货True
    if form.validate_on_submit():
        # 验证合格,获取数据
        username = form.username.data
        password = form.pwd.data
        password2 = form.pwd2.data
        print(username, password, password2)
        session['username'] = username
        session['password'] = password
        return redirect(url_for('index'))

    return render_template('regist.html', form=form)

三: 在模板中创建表单

<form action="" method='post'>
    <!-- csrf攻击防护 -->
    {{ form.csrf_token }}

    <!-- 用户名框 -->
    {{ form.username.label }} </br>
    <p>{{ form.username }}</p> 
    <!-- 错误时,显示提示 -->
    {% for error in form.username.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 密码框 -->
    {{ form.pwd.label }}  </br>
    <p>{{ form.pwd }}</p>
    {% for error in form.pwd.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 重复密码框 -->
    {{ form.pwd2.label }}  
    </br><p>{{ form.pwd2 }}</p>
    {% for error in form.pwd2.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 提交 -->
    <p>{{ form.submit }}</p>
</form>

常用表单字段

StringField       文本字段
TextAreaField     多行文本字段
PasswordField     密码文本字段
HiddenField      隐藏文本字段
DateField
DateTimeField
IntegerField
DecimalField      十进制小数
FloatField      浮点数
BooleanField      布尔值
RadioField      单选框
SelectField      下拉列表
SelectMultipleField      下拉列表,可选多个值
FileField     文本上传文字段
SubmitField     表单提交按钮
FormField      嵌套表单
FieldList      一组指定类型的字段

常用验证函数

需要设置SECRET_KEY

from wtforms.validators import  ……(对应的验证函数)

DataRequired(‘用户名不能为空’)     必填项     // 可选参参数,参数值为错误提示词
EqualTo(…)     比较两个值一样     // 两个参数,一为比较项,一为错误提示
Length     验证输入的字符串长度
NumberRange     验证输入的值是否在数字范围
URL     验证url
AnyOf     验证输入值在可选列表中
NoneOf     验证输入值不再可选列表中


实例完整代码

from flask import Flask, render_template, redirect, url_for, session
from flask_wtf import FlaskForm
from wtforms import SubmitField, StringField, PasswordField
from wtforms.validators import DataRequired, EqualTo

app = Flask(__name__)
app.config['SECRET_KEY'] = "aslasfobjbfjk12bbkf3"

#  创建表单类
class RegistForm(FlaskForm):
    username = StringField('用户名', validators=[DataRequired("用户名不能为空")])
    pwd = PasswordField('密码', validators=[DataRequired('密码不能为空')])
    pwd2 = PasswordField('重复密码', validators=[DataRequired('密码不能为空'), EqualTo('pwd', '两次密码不一致')])
    submit = SubmitField('注册')

# 定义路由函数,生成表单
@app.route('/regist', methods=['GET', 'POST'])
def regist():
    # 创建表单对象,如果式post提交,前端发送的数据会保存在该表单对象
    form = RegistForm()
    # 判断表单字段是否合理,只有当所有验证通过,form.validate_on_submit才返回True
    if form.validate_on_submit():
        # 验证合格,获取数据
        username = form.username.data
        password = form.pwd.data
        password2 = form.pwd2.data
        print(username, password, password2)
        session['username'] = username
        session['password'] = password
        return redirect(url_for('index'))

    return render_template('regist.html', form=form)

@app.route('/index')
def index():
    username = session.get('username', '')
    return "Hello %s" % username

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

regidt.html

<form action="" method='post'>
    <!-- csrf攻击防护 -->
    {{ form.csrf_token }}

    <!-- 用户名框 -->
    {{ form.username.label }} </br>
    <p>{{ form.username }}</p> 
    <!-- 错误时,显示提示 -->
    {% for error in form.username.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 密码框 -->
    {{ form.pwd.label }}  </br>
    <p>{{ form.pwd }}</p>
    {% for error in form.pwd.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 重复密码框 -->
    {{ form.pwd2.label }}  
    </br><p>{{ form.pwd2 }}</p>
    {% for error in form.pwd2.errors %}
        <p>{{ error }}</p>
    {% endfor %}

    <!-- 提交 -->
    <p>{{ form.submit }}</p>
</form>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值