4、flask第四站-表单
来源:互联网 发布:平板电脑看电影软件 编辑:程序博客网 时间:2024/06/18 18:30
1、创建表单
使用 Flask-WTF 时,每个 Web 表单都由一个继承自 Form 的类表示。这个类定义表单中的一组字段,每个字
段都用对象表示。字段对象可附属一个或多个验证函数。验证函数用来验证用户提交的输入值是否符合要求。
【hello.py】
# 一个简单的 Web 表单,包含一个文本字段和一个提交按钮from flask_wtf import FlaskForm # Form 基类由 Flask-WTF 扩展定义 #作为表单类的基类 from wtforms import SubmitField,StringField #字段直接从 WTForms 包中导入 #表单类的属性,字段 from wtforms.validators import DataRequired,Length #验证函数直接从 WTForms 包中导入 #字段的验证函数,每一个字段都要有一个验证函数,但是submit例外 class NameForm(Form): name = StringField('Input your name:',validators=[DataRequired()]) submit = SubmitField('Submit')
这个表单中的字段都定义为类变量,类变量的值是相应字段类型的对象。在这个示例中,NameForm 表单中有
一个名为 name 的文本字段和一个名为 submit 的提交按钮。 StringField类表示属性为 type=”text” 的
元素。 SubmitField 类表示属性为 type=”submit” 的 元素。字段构造函数的第一个参数是
把表单渲染成 HTML 时使用的标号。
StringField 构造函数中的可选参数 validators 指定一个由验证函数组成的列表,在接受用户提交的数据之
前验证数据。验证函数 Required() 确保提交的字段不为空。
WTForms 支持的 HTML 标准字段下表所示:
WTForms 内建的验证函数如下表所示:
2、把表单渲染成HTML
【form.html】( M)
{% extends "base.html" %}#继承基类{% import "bootstrap/wtf.html" as wtf %}导入wtf.quick_form用来快速生成表单{% block title %}Flasky{% endblock %}#表头{% block page_content %}<div class="page-header"> <h1> Hello, {% if name %}{{ name }}{% else %}Stranger{% endif %}! </h1></div>{{ wtf.quick_form(form) }}#快速生成,并且把表单信息传进去{% endblock %}
import 指令的使用方法和普通 Python 代码一样,允许导入模板中的元素并用在多个模板中。导入的
bootstrap/wtf.html 文件中定义了一个使用 Bootstrap 渲染 Falsk-WTF 表单对象的辅助函数。
wtf.quick_form() 函数的参数为 Flask-WTF 表单对象,使用 Bootstrap 的默认样式渲染传入的表单。
3、视图函数中处理表单 (V)
【views.html】
@app.route('/form/',methods = ['GET','POST'])#app.route 修饰器中添加的 methods 参数告诉 Flask 在 URL 映射中把这个视图函数注册为GET 和 POST def form(): name = None #名字先空 form = NameForm() #生成一个表单 if form.validate_on_submit(): name = form.name.data form.name.data = '' return render_template('form.html',form = form, name = name) #渲染表单
第一部分是页面头部,显示欢迎消息。这里用到了一个模板条件语句。 Jinja2
中的条件语句格式为 {% if condition %}…{% else %}…{% endif %}。
如果条件的计算结果为 True,那么渲染 if 和 else 指令之间的值。如果条件的计算结果为False,则渲染
else 和 endif 指令之间的值。在这个例子中,如果没有定义模板变量 name,则会渲染字符串“Hello,
Stranger!”。内容区的第二部分使用 wtf.quick_form() 函数渲染NameForm 对象。
4、重定向与用户会话
为什么要重定向会话呢?因为当用户提交的时候表单method是POST,POST会成为
浏览器最后的一个请求,当刷新的时候,POST会导致刷新的时候再次提交。所以,要进行
重定向,使其成为GET。Post/ 重定向 /Get 模式。
【views.html】( v )
from flask import session@app.route('/form2/',methods = ['GET','POST'])def form2(): form = NameForm() if form.validate_on_submit(): session['name'] = form.name.data # 这里也不需要设置form.name.data = '',因为已经重定向到别的url去了,下次再到这个界面会自动初始化为'' return redirect(url_for('hello')) return render_template('form.html',form = form, name = session.get('name'))
局部变量 name 用来存放表单中输入的有效名字,如果没有输入,其值为 None。如上述代码所示,在视图函
数中创建一个 NameForm 类实例用于表示表单。提交表单后,如果数据能被所有验证函数接受, 那么
validate_on_submit() 方法的返回值为 True,否则返回 False。这个函数的返回值决定是重新渲染表单还是
处理表单提交的数据。
5、Flash消息
让用户知道状态发生了变化
【views.html】
from flask import flash@app.route('/form3/',methods = ['GET','POST'])def form3(): form = NameForm() if form.validate_on_submit(): old_name = session.get('name') if old_name is not None and old_name != form.name.data : flash('you have changed your name') session['name'] = form.name.data return redirect(url_for('hello')) return render_template('form.html',form = form, name = session.get('name'))
每次提交的名字都会和存储在用户会话中的名字进行比较,而会话中存储的名字是前一次在这
个表单中提交的数据。如果两个名字不一样,就会调用 flash() 函数,在发给客户端的下一个响应中显示一
个消息
在基模板里添加
【base.html】
{% block content %}<div class="container"> {% for message in get_flashed_messages() %} <div class="alert alert-warning"> <button type="button" class="close" data-dismiss="alert">×</button> {{ message }} </div> {% endfor %} {% block page_content %}{% endblock %}</div>{% endblock %}
在模板中使用循环是因为在之前的请求循环中每次调用 flash() 函数时都会生成一个消息,所以可能有多个
消息在排队等待显示。 get_flashed_messages() 函数获取的消息在下次调用时不会再次返回,因此 Flash消息只显示一次,然后就消失了。
- 4、flask第四站-表单
- Flask(4)-Web表单
- flask笔记:4:web表单
- flask 表单
- 细说flask表单flask-wtf
- 《Flask Web开发》读书笔记(4)第4章Web表单(关键词:Web开发/Flask/表单/Web表单)
- Flask-HelloWorld-05 表单
- Flask web表单
- Flask创建表单
- Flask-Web 表单
- Flask 多表单
- Flask Web开发 表单
- Flask: Web表单
- Flask的表单处理
- Flask入门五:表单
- Web表单(Flask-WTF)
- flask中web表单应用
- flask学习笔记(-Web 表单)
- python md5
- C#中Dispose和Close的区别
- PostgreSQL数据库Dig9
- c/c++ 数字转成字符串, 字符串转成数字
- 操作系统
- 4、flask第四站-表单
- Matlab 实时录音(声卡)及频谱显示
- MyBatis代码
- 【翻译搬运】起源引擎(Source)多人模式网络同步模型(Source Multiplayer Networking)【一】
- 云服务对Linux运维的影响
- HDU 6185 && 2017广西邀请赛:Covering(矩阵快速幂)
- Android异步任务AsyncTask完全解析
- 如何通过思维导图来进行自我管理的6种模板鉴赏
- 设计一个进度条