zoukankan      html  css  js  c++  java
  • Flask系列09--Flask中WTForms插件,及自定义验证器

    一.概述

      django中的forms组件非常的方便,在flask中有WTForms的组件实现的也是类似的功能, 安装这个插件

    二.简单使用

      文档地址https://wtforms.readthedocs.io/en/latest/

      简单写一个注册的form

    # 注册表单
    class RegForm(Form):
        username = simple.StringField(
            label='用户名',
            validators=[validators.DataRequired(message='用户名不能为空')]
    
        )
    
        password = simple.PasswordField(
            label='密码',
            validators=[
                validators.DataRequired(message='密码不能为空'),
                validators.Length(min=1, max=10, message='密码长度不正确'),
            ]
        )
    
        re_password = simple.PasswordField(
            label='确认密码',
            validators=[
                validators.EqualTo('password', message='密码不一致')
            ]
        )
    
        email = simple.StringField(
            label='邮箱',
            validators=[
                validators.Email(message='邮箱格式不正确')
            ]
        )
    
        hobby = core.SelectMultipleField(
            label='爱好',
            choices=[
                (1, '足球'),
                (2, '篮球'),
                (3, '网球'),
            ],
    
            default=[1, 3],  # 设置默认值,
            coerce=int
    
        )
    
        gender = core.SelectField(
            label='性别',
            choices=[
                (1, ''),
                (2, '')
            ],
            default=1,
            coerce=int
        )
    
        sub = simple.SubmitField(
            label='提交',
            render_kw={'style': "color: red"},
        )

    这里写了sub按钮,在前端文件中如果不想让标签显示出来比如

    前端页面可以这样写

    <form action="" method="post" novalidate>
        {% for field in form_obj %}
            {% if field.type == "SubmitField" %}
                <p>{{ field }}{{ field.errors.0 }}</p>
            {% else %}
                <p>{{ field.label }}{{ field }}{{ field.errors.0 }}</p>
            {% endif %}
        {% endfor %}
    </form>

    结果预览:

    三 . 自定义验证器 validator

      有两种写法,一种是类的,另外一种是写成函数

    1.函数

    class SignupForm(Form):
        age = IntegerField(u'Age')
        def validate_age(form, field):
            if field.data < 13:
                raise ValidationError("We're sorry, you must be 13 or older to register")

    2. 类

    # 自定义验证器,类 的写法
    class pwd_validator():
        def __init__(self, message=None):
            self.message = message
        def __call__(self, form, field):
            pwd = field.data
            if pwd != '123':
                raise ValidationError(self.message)

    示例 登陆:

    # 自定义验证器,类 的写法
    class pwd_validator():
        def __init__(self, message=None):
            self.message = message
        def __call__(self, form, field):
            pwd = field.data
            if pwd != '123':
                raise ValidationError(self.message)
    
    
    class LoginForm(Form):
        username = simple.StringField(
            label='用户名',
            validators=[validators.DataRequired(message='用户名不能为空'), ]
        )
        # 自定义验证器, 函数的写法
        def validate_username(form, field):
            if field.data != 'tom':
                raise ValidationError('用户名错误')
        password = simple.PasswordField(
            label='密码',
            validators=[
                validators.DataRequired(message='密码不能为空'),
                validators.Length(min=1, max=10, message='密码长度不正确'),
                pwd_validator('密码必须是123'),
    
            ]
        )
        sub = simple.SubmitField(
            label='登陆',
            render_kw={'class': 'red'}
        )

    cbv中运用

    class Login(views.MethodView):
        def get(self):
            form_obj = LoginForm()
            return render_template("login.html", form_obj=form_obj)
        def post(self):
            dic = request.form.to_dict()
            username = dic.get('username')
            password = dic.get('password')
    # if username == 'tom' and password == '123': login_data = LoginForm(request.form) if login_data.validate(): # print(login_data.data) session['user'] = dic['username'] s = session.get('user') return '登陆成功 session是{}'.format(s) else: return render_template('login.html', form_obj=login_data)

  • 相关阅读:
    SAP系统管理中常见问题解答(转载)
    STMS传输队列中的请求状态一直是Running不能结束
    通过Tcode查找Badi或者客户出口
    通过LDB_PROCESS函数使用逻辑数据库
    ABAP读取长文本的方法
    SAP增强Enhancement
    ABAP开发顾问必备:SAP ABAP开发技术总结[转载]
    SAP事件 Event Flow(转载)
    jQuery中的text()、html()和val()以及javaScript中的innerText、innerHTML和value
    js访问对象属性的方式“.”与“[]”的区别
  • 原文地址:https://www.cnblogs.com/robertx/p/10692665.html
Copyright © 2011-2022 走看看