一.概述

  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=,
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 != '':
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 != '':
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)

Flask系列09--Flask中WTForms插件,及自定义验证器的更多相关文章

  1. flask中的endpoint、自定义转化器、与djnago中session区别、利用装饰器实现登录认证

    flask路由中的endpoint 与自定义转化器 ''' endpoint主要用于 反向解析, 例如:login函数中配的路由是/login,其中endpoint='lg' 则在其他函数,可以用 u ...

  2. flask 自定义验证器(行内验证器、全局验证器)

    自定义验证器 在WTForms中,验证器是指在定义字段时传入validators参数列表的可调用对象,下面来看下编写自定义验证器. 行内验证器 除了使用WTForms提供的验证器来验证表单字段,我们还 ...

  3. Flask系列(二)Flask基础

    知识点回顾 1.flask依赖wsgi,实现wsgi的模块:wsgiref(django),werkzeug(flask),uwsgi(上线) 2.实例化Flask对象,里面是有参数的 app = F ...

  4. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  5. 在pixi中使用你的自定义着色器

    通过几天的学习,对openGL.shader有了一个大致的了解. 回到学习的初衷吧,在基于pixi.js重构D3项目的时候,因为精灵层级的问题,我得按照一定的先后顺序将不同类别的精灵添加到场景中去. ...

  6. Flask系列之蓝图中使用动态URL前缀

    让我们先来看一个简单的例子,假设有下面这样一个蓝图(是关于用户主页的): from flask import Blueprint, render_template profile = Blueprin ...

  7. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler

    一.使用 Flask中的特殊装饰器(中间件)方法常用的有三个 @app.before_request # 在请求进入视图函数之前 @app.after_request # 在请求结束视图函数之后 响应 ...

  8. Flask系列(四)Flask实现简单页面登陆

    from flask import Flask,render_template,request,redirect,session app = Flask(__name__,template_folde ...

  9. Flask系列(五)Flask实现分页

    一.flask分页组件 from urllib.parse import urlencode,quote,unquote class Pagination(object): ""& ...

随机推荐

  1. EditText输入小数

    edtValue.setInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);

  2. python - package - bs4 - 美味汤

    Beautiful Soup 3 only works on Python 2.x, but Beautiful Soup 4 also works on Python 3.x. 你可能在寻找 Bea ...

  3. Tarjan 割点,桥

    /* ggg ggg ggggggg ggggggg ggggggggggggggggggg ggggggggggggggg ggggggggggg ggggggg ggg g */ /* gyt L ...

  4. 下载安装mysql的一些坑

    在mysql下载安装的过程中会有一些坑,另外navicat连接mysql数据库时也存在一定的坑,总结如下: 1.计算机中丢失某个dll文件 这个问题好解决,下载个文件就搞定了,下载地址:https:/ ...

  5. react父转子

    父组件使用子组件,子组件绑定父组件数据 ,子组件用props使用父组件数据 import React, { Component } from 'react'; import logo from './ ...

  6. 第1章 Python数据模型

    #<流畅的Python>读书笔记 # 第一部分 序幕 # 第1章 Python数据模型 # 魔术方法(magic method)是特殊方法的昵称.于是乎,特殊方法也叫双下方法(dunder ...

  7. latex字体颜色

    具体的如下:\usepackage{color} 1. {\color{red} 文本} 2. \textcolor[rgb]{1,0,0}{文本}  颜色参数范围为[0,1]

  8. 详细解读 :java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed,Java报错之Connection is read-only.

    问题分析: 实际开发项目中,进行insert的时候,产生这个问题是Spring框架的一个安全权限保护方法,对于方法调用的事物保护,一般配置如下: <!-- 事务管理 属性 --> < ...

  9. oracle学习笔记一:用户管理(1)简单的命令

    1,打开操作界面 我们在安装好oracle后可以在两个地方打开要操作的界面.请看图一: 或者在运行窗口输入sqlplus.其实这里也是调用了bin下面的sqlplus.exe. 在打开dos命令行窗口 ...

  10. hibernate之helloword(环境搭建)

    环境搭建 hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ...