flask实战-个人博客-表单
表单
下面我们来编写所有表单类,personalBlog中主要包含下面这些表单:
登录表单;
文章表单;
评论表单;
博客设置表单;
这里仅介绍登录表单、文章表单、分类表单和评论表单,其他的表单在实现上基本相同。
删除资源也需要使用表单来实现,这里之所以没有创建表单类,是因为后面我们会介绍在实现删除操作时为表单实现CSRF保护的更方便的做法。
1、登录表单
用于登录的LoginForm表单类的实现如下所示:
personalBlog/forms.py: 登录表单
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, BooleanField
from wtforms.validators import DataRequired class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired(), Length(1, 20)])
password = PasswordField('Password', validators=[DataRequired(), Length(8, 128)])
remember = BooleanField('Remember me')
submit = SubmitField('Log in')
登录表单由用户名字段(username)、密码字段(password)、“记住我”复选框(remember)和“提交”按钮(submit)组成。其中使用了两个新字段: 一个是表示<input type=”password”>的密码字段PasswordField,它会使用黑色原点来表示密码;另一个是表示<input type=”checkbox”>的复选框字段BooleanField,它会返回布尔值作为数据。
2、文章表单
用于创建文章的PostForm表单类的实现如下所示:
personalBlog/forms.py: 文章表单
from flask_ckeditor import CKEditorField
from wtforms import SelectField
from wtforms.validators import DataRequired, Length from personalBlog.models import Category class PostForm(FlaskForm):
title = StringField('Title', validators=[DataRequired(), Length(1, 60)])
category = SelectField('Category', coerce=int, default=1)
body = CKEditorField('Body', validators=[DataRequired()])
submit = SubmitField() def __init__(self, *args, **kwargs):
super(PostForm, self).__init__(*args, **kwargs)
self.category.choices = [(category.id, category.name)
for category in Category.query.order_by(Category.name).all()]
文章创建表单由标题字段(title)、分类选择字段(category)、正文字段(body)和“提交”按钮组成,其中正文字段使用Flask-CKEditor提供的CKEditorField字段。
下拉列表字段使用WTForms提供的SelectField类来表示HTML中的<select>标签。下拉列表的选项(即<option>标签)通过参数choices指定。choices必须是一个包含量元素元祖的列表,列表中的元祖分别包含选项值和选项标签。我们使用分类的id作为选项值,分类的名称作为选项标签,这两个值通过迭代Category.query.order_by(Category.name).all()返回的分类记录实现。选择值摩恩为字符串类型,我们使用coerce关键字指定数据类型为整形。default用来设置默认的选项值,我们将其指定为1,即默认分类的id。
因为Flask-SQLAlchemy依赖于程序上下文才能正常工作(内部使用current_app获取配置信息),所以这个查询调用要放到构造方法中执行,在构造方法中对self.category.choices赋值的效果和在类中实例化SelectField类并设置choices参数相同。
3、分类表单
用于创建分类的CategoryForm表单类的实现如下所示:
personalBlog/forms.py: 分类创建表单
from wtforms.validators import DataRequired
from wtforms import ValidationError
from personalBlog.models import Category class CatetoryForm(FlaskForm):
name = StringField('Name', validators = [DataRequired(), Length(1, 30)])
submit = SubmitField() def validate_name(self, field):
if Category.query.filter_by(name = field.data).first():
raise ValidationError('Name already in use.')
分类创建字段仅包含分类名称字段(name)和提交字段。分类的名称要求不能重复,为了避免写入重复的分类名称导致数据库出错,我们在CategoryForm类中添加了一个validate_name方法,作为name字段的自定义行内验证器,它将在验证name字段时和其他验证函数一起调用。在这个验证方法中,我们使用字段的值(field.data)作为name列的参数值进行查询,如果查询到已经存在同名记录,那么久爆出ValidationError异常,传递错误消息作为参数。
4、评论表单
用于创建评论的CommentForm表单类的实现如下所示:
personalBlog/forms.py: 评论表单
from wtforms import TextAreaField
from wtforms.validators import Email, URL, Length, Optional class CommentForm(FlaskForm):
author = StringField('Name', validators = [DataRequired(), Length(1, 30)])
email = StringField('Email', validators = [DataRequired(), Email(), Length(1, 254)])
site = StringField('Site', validators = [Optional(), URL(), Length(0, 255)])
body = TextAreaField('Comment', validators = [DataRequired()])
submit = SubmitField()
在这个表单中,email字段使用了用于验证电子邮箱地址的Email验证器。另外,因为评论者的站点是可以留空的字段,所以我们使用Optional验证器来使字段可以为空。site字段使用URL验证器确保输入的数据为有效的URL。
因为site字段可以为空,所以一并附加的Length验证器的最小长度需要设为0。
和匿名用户的表单不同,管理员不需要填写诸如姓名、电子邮箱等字段。我们单独为管理员创建了一个表单类,这个表单类继承自CommentForm类,如下所示:
personalBlog/forms.py:管理员的评论表单
from wtforms import HiddenField class AdminCommentForm(CommentForm):
author = HiddenField()
email = HiddenField()
site = HiddenField()
在这个表单中,姓名、Email、站点字段使用HiddenField类重新定义。这个类型代表隐藏字段,即HTML中的<input type=”hidden”>。
在模板中手动渲染表单时,我们可以使用Flask-WTF为表单添加的hidden_tag()方法来渲染所有隐藏字段,而不用逐个调用三个属性。另外,hidden_tag()方法会一并渲染CSRF令牌字段,因此不用在手动调用csrf_token属性。
flask实战-个人博客-表单的更多相关文章
- flask实战-个人博客-虚拟环境、项目结构
个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...
- flask实战-个人博客-模板 --
模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模 ...
- flask实战-个人博客-使用蓝本模块化程序
使用蓝本模块化程序 实例化flask提供的blueprint类就创建一个蓝本实例.像程序实例一样,我们可以为蓝本实例注册路由.错误处理函数.上下文处理函数,请求处理函数,甚至是单独的静态文件文件夹和模 ...
- flask实战-个人博客-数据库-生成虚拟数据 --
3.生成虚拟数据 为了方便编写程序前台和后台功能,我们在创建数据库模型后就编写生成虚拟数据的函数. 1)管理员 用于生成虚拟管理员信息的fake_admin()函数如下所示: personalBlog ...
- flask实战-个人博客-编写博客前台
编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有 ...
- flask实战-个人博客-电子邮件支持
电子邮件支持 因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员.而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者. 为了方便读者使用示例程序,personalBlog中仍然使 ...
- flask实战-个人博客-视图函数
视图函数 在上面我们创建了所有必须的模型类.模板文件和表单类.经过程序规划和设计后,我们可以创建大部分视图函数.这些视图函数暂时没有实现具体功能,仅渲染对应的模板,或是重定向到其他视图.以blog蓝本 ...
- flask实战-个人博客-程序骨架、创建数据库模型、临接列表关系 --
编写程序骨架 personalBlog的功能主要分为三部分:博客前台.用户认证.博客后台,其中包含的功能点如下图所示: 数据库 personalBlog一共需要使用四张表,分别存储管理员(Admin) ...
- flask实战-个人博客-使用类组织配置
使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...
随机推荐
- Jena Fuseki安装完成后不能添加数据库
问题描述:安装Jena成功后可以进入管理页面,无法通过界面选择和查询数据 解决方案: 进入 apache-jena-fuseki-3.12.0\run 修改 shiro.ini 配置文件 注释 /$/ ...
- maven setting 配置仓库,pom.xml中repository不起作用
问题描述 最近做java项目,需要使用公司自己搭建的maven仓库,但是有些包公司的仓库中没有,导致下载失败. 项目环境 jdk:1.8 maven:3.5 问题原因分析 maven的setting文 ...
- Java基础语法面试题
1,关于JDK,JRE,JVM [为什么安装包要分JDK和JRE?] 先来说说什么是JDK,JRE. JDK:Java Development Kit Java开发工具包[开发Java程序用] JRE ...
- FZU 1759 题解 欧拉降幂
本题考点:欧拉降幂 Super A^B mod C Given A,B,C, You should quickly calculate the result of A^B mod C. (1<= ...
- forever帮助node应用后台运行
windows系统下,运行node应用的时候,会有个命令窗存在,看着就碍眼,而且一不小心就关掉了,那有没有方法让node应用也可以运行在后台呢?方法也不止一种,我这里就选forever了,因为安装使用 ...
- aspect原理分析
人的记忆能力是有限的,分析.建模与解释能力是无限的 Call Hierarchy isa hook aspect_hookClass() aspect_prepareClassAndHookSelec ...
- SpringBoot热部署(实战)详解
热部署是什么 大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的 Class 文件,这个文件里记录着和代码等对应 ...
- 数据库xp_cmdshell使用
首先也开启组件. sp_configure reconfigure go sp_configure reconfigure go 删除本地文件,注意是删除数据库所在的服务器的本地文件. exec ma ...
- python动态视频下载器
这里向大家分享一下python爬虫的一些应用,主要是用爬虫配合简单的GUI界面实现视频,音乐和小说的下载器.今天就先介绍如何实现一个动态视频下载器. 爬取电影天堂视频 首先介绍的是python爬取电影 ...
- Python多任务—进程
一.进程以及状态 1.进程 正在运行的应用程序就是一个进程.进程是资源分配的基本单元. Python多进程可以在多核CPU上运行,多进程充分利用了多核的资源. 2. 进程的状态 工作中,任务数往往大于 ...