WTForms是什么?

相当于django的ModelForm。

在网页中,为了和用户进行信息交互总是不得不出现一些表单。flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据。WTForm中最重要的几个概念如下:

  Form类,开发者自定义的表单必须继承自Form类或者其子类。Form类最主要的功能是通过其所包含的Field类提供对表单内数据的快捷访问方式。

  各种Field类,即字段。一般而言每个Field类都对应一个input的HTML标签。比如WTForm自带的一些Field类比如BooleanField就对应<input type="checkbox">,SubmitField就对应<input type="submit">等等。

  Validator类。这个类用于验证用户输入的数据的合法性。比如Length验证器可以用于验证输入数据的长度,FileAllowed验证上传文件的类型等等。

  另外,flask为了防范csfr(cross-site request forgery)攻击,默认在使用flask-wtf之前要求app一定要设置过secret_key。最简单地可以通过app.config['SECRET_KEY'] = 'xxxx'来配置。app的配置涉及到如何架构整个项目目录,这里默认这个SECRET_KEY已经配置完成。

直接上代码:

后端代码:

from flask import Flask, render_template,request
from wtforms.fields import simple, core #用来创建组件
from wtforms import validators
from wtforms import Form #被继承 app = Flask(__name__) class LoginForm(Form):
username = simple.StringField(
label="用户名", # 标签标记
validators=[validators.DataRequired(message="用户名不能为空"),
validators.Length(min=,max=,message="不是长了就是短了")], # 校验条件 可迭代条件
# description='', # 描述标记
id="user_id", # 标签ID
default=None, # 默认值
widget=None, # 默认组件(input type="text") 在StringField中已经被实例化了
render_kw={"class":"my_login"}, # {"class":"my_login"}
)
password = simple.PasswordField(
label="密码", # 标签标记
validators=[validators.DataRequired(message="密码不能为空"),
validators.Length(min=, max=, message="不是长了就是短了"),
validators.Email(message="密码必须符合邮箱规则")], # 不知道
# description='', # 描述标记
id="user_id", # 标签ID
default=None, # 默认值
widget=None, # 默认组件(input type="text") 在PasswordField中已经被实例化了
render_kw={"class": "my_login"}, # {"class":"my_login"}
) class RegForm(Form):
username = simple.StringField(
label="用户名", # 标签标记
validators=[validators.DataRequired(message="用户名不能为空"),
validators.Length(min=,max=,message="用户名不是长了就是短了")], # 校验条件 可迭代条件
) password = simple.PasswordField(
label="密码", # 标签标记
validators=[validators.DataRequired(message="密码不能为空"),
validators.Length(min=, max=, message="密码不是长了就是短了"),
validators.Email(message="密码必须符合邮箱规则")],
) repassword = simple.PasswordField(
label="确认密码", # 标签标记
validators=[validators.EqualTo(fieldname="password",message="眼神未确认")]
) gender = core.RadioField(
label="性别",
coerce=str,
choices=(
("","女"),
("","男")
),
default=""
) hobby = core.SelectMultipleField(
label="爱好",
validators=[validators.Length(min=,max=,message="癖好有问题")],
coerce=int,
choices=(
(, "fengjie"),
(, "luoyufeng"),
(, "lixueqin"),
(, "wuyifan"),
(, "panta")
),
default=(,,)
) @app.route("/",methods=["GET","POST"])
def index():
if request.method == "GET":
fm = LoginForm()
return render_template("index.html",wtf = fm)
else:
new_fm = LoginForm(request.form)
if new_fm.validate():
return new_fm.data.get("password")
else:
return render_template("index.html", wtf=new_fm) @app.route("/reg",methods=["GET","POST"])
def reg():
if request.method == "GET":
rf = RegForm()
return render_template("reg.html",rf = rf)
else:
rf = RegForm(request.form)
if rf.validate():
print(type(rf.data.get("gender")),rf.data.get("gender"))
return rf.data.get("password")
else:
return render_template("reg.html", rf=rf) if __name__ == '__main__':
app.run(debug=True)

前端代码:index

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{{ wtf.username.label }}
{{ wtf.username }}
<p><h1>{{wtf.username.errors.}}</h1></p>
<p>
{{ wtf.password.label }}
{{ wtf.password }}
</p>
<p><h1>{{wtf.password.errors.}}</h1></p>
<input type="submit" value="登录">
</form>
</body>
</html>

前端代码reg

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Title</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<form action="" method="post" novalidate>
{% for field in rf %}
<p>{{ field.label }}{{ field }}{{ field.errors. }}</p>
{% endfor %}
<input type="submit" value="注册">
</form>
</body>
</html>

访问效果:

 
 
 

最新文章

  1. oracle中DDL DML指什么?
  2. find principles
  3. Chrome&amp;FF&amp;Opera&amp;下DIV不设置高度显示背景颜色和边框的办法
  4. 【译】ASP.NET MVC 5 教程 - 7:Edit方法和Edit视图详解
  5. iOS不可变字符串的所有操作
  6. SDAU课程练习--problemC
  7. android TransFormexecption 解决
  8. Redis 2种持久化模式的缺陷
  9. Shell中的数组及其相关操作
  10. 怎样从外网访问内网Resin
  11. JDK 安装目录中 native2ascii.exe 命令详解
  12. Python 函数(可变参数)
  13. PYTHON编码处理-str与Unicode的区别
  14. 【PAT】1020 Tree Traversals (25)(25 分)
  15. 牛客网某比赛 I 小乐乐学博弈 博弈论
  16. python中对两个 list 求交集,并集和差集
  17. 网站app原型设计工具:axure,Mockups,墨刀
  18. 理解PHP数组的序列化和反序列化
  19. SimpleDateFormat格式化日期以及日期的相关操作
  20. Web—08-移动端库和框架

热门文章

  1. RDF类型报表-PDF中文乱码
  2. Android自定义控件练手——波浪效果
  3. 在unbuntu 1204(32位)下安装hadoop2.2.0的一些问题
  4. java,eclipse中如何添加httpclient.jar
  5. mybatis返回boolean值时数据库返回null
  6. Tomcat配置文件server.xml分析
  7. Linux学习_按时间顺序解压多个文件,搜索文件中的内容
  8. DP之背包问题详解及案例
  9. 【转】Android的setTag
  10. unity简单例子