• Flask-WTForms 简单使用


    安装 wtforms 2.2.1

    直接上代码:

    app.py 文件:

    from flask import Flask, render_template, request
    from wtforms import Form, validators
    from wtforms.fields import simple, core
    
    
    # form 字段设计
    class RegForm(Form):
        # simple 字段类型
        # StringField 和 TextAreaField 都是字符串的意思,StringField支持的类型少于StringField
        username = simple.StringField(
            label="用户名",
            validators=[  # validators -- 校验信息
                validators.DataRequired(message="用户不能为空"),  # DataRequired -- 当前的地方必须填写数据;  message -- 错误信息
                validators.length(min=4, max=8, message="用户名必须大于等于4小于等于8")  # length -- 长度
            ],
            render_kw={"class": "my_class"}  # 添加 class
        )
    
        password = simple.PasswordField(
            label="密码",
            validators=[
                validators.DataRequired(message="密码不能为空"),
                validators.length(min=6, max=16, message="密码必须大于等于6小于等于16")
            ],
            render_kw={"class": "my_class"}  # 添加 class
        )
    
        repassword = simple.PasswordField(
            label="重复密码",
            validators=[
                validators.DataRequired(message="重复密码不能为空"),
                validators.EqualTo("password", message="两次密码不一致")  # EqualTo("字段名称") 判断该字段是否等于"字段名称"中的值
            ]
        )
    
        gender = core.SelectField(  # 单选字段在核心模块(支持的类型多)中才有
            label="性别",
            choices=(  # 选项
                (1, ""),
                (2, "")
            ),
            default=2,  # 默认值
            coerce=int  # 指定前端提交过来的选项的类型是数字还是字符串 下边有验证
        )
    
        email = simple.StringField(
            label="邮箱",
            validators=[
                validators.Email(message="不符合规定")
            ]
        )
    
        hobby = core.SelectMultipleField(  # 多选字段
            label="爱好",
            choices=(
                ("1", "读书"),
                ("2", "美食"),
                ("3", "电影"),
                ("4", "音乐"),
            ),
            default=("1", "2", "3", "4"),
            coerce=str  # 指定前端提交过来的选项的类型是数字还是字符串 下边有验证
        )
    
    
    app = Flask(__name__)  # 实例化 app
    
    reg_form = RegForm()  # form信息(对象)赋值给reg_form
    
    
    @app.route("/form_reg", methods=["GET", "POST"])
    def reg():
        if request.method == "GET":
            return render_template("form_reg.html", reg_form=reg_form)
        if request.method == "POST":
            reg_form_data = RegForm(request.form)  # 拿到前端传过来的数据(request.form),给RegForm进行校验
            if reg_form_data.validate():  # 如果前段穿过来的数据通过校验
                print(type(reg_form_data.data.get("gender")))   # <class 'int'>
                print(reg_form_data.data.get("hobby"))      # ['1', '2', '3', '4']
                return " * {注册成功} *    愿世界和平,无病无灾"
            else:
                # 前端传过来的内容未通过校验,返回注册页面, 附带注册提交的错误数据和错误提示
                return render_template("form_reg.html", reg_form=reg_form_data)
    
    
    if __name__ == '__main__':
        app.run()

    form_reg.html 文件:

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta http-equiv="content-Type" charset="UTF-8">
        <meta http-equiv="x-ua-compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Title</title>
    
        <style>
            .my_class{
                 500px;
            }
        </style>
    </head>
    <body>
    <h1>注册页面</h1>
    <form action="" method="post" enctype="multipart/form-data" novalidate>
        {% for field in reg_form %}
            <p>{{ field.label }}: {{ field }} <span style="color: red">{{ field.errors.0 }}</span> </p>
        {% endfor %}
    
    {#    {{ reg_form.username.label }}: {{ reg_form.username }}{{ reg_form.username.errors.0 }}<br>#}
    {#    {{ reg_form.password.label }}: {{ reg_form.password }}{{ reg_form.password.errors[0] }}<br>#}
    
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
  • 相关阅读:
    Google官方关于Android架构中MVP模式的示例续-DataBinding
    值不值
    [译]Godot系列教程五
    [译]Google官方关于Android架构中MVP模式的示例
    遭遇Web print
    如何寻找有价值的点
    充电时间 Go中的数组、切片、map简单示例
    一段良好的程序永远不应该发生panic异常
    居然是Firefox没有抛弃我们
    macOS 升级到了10.12.1
  • 原文地址:https://www.cnblogs.com/yuanyongqiang/p/10453669.html
Copyright © 2020-2023  润新知