flask-admin章节二:wtforms的使用以及在数据库场景中使用QuerySelectField代替SelectField
概述
flask admin可以支持自定义视图,对于涉及到比较复杂的视图可以选择继承flask_admin.BaseView来定义自己期待的结构。
自定义的视图的每个函数可以使用flask_admin.expose 语法糖来装饰,从而可以定义自己期待接收的HTTP方法和对外的URL。
flask admin的良好封装,使得自定义视图非常的方便。
自定义视图中少不了涉及各种表单操作,对于不是很习惯写前端的朋友来说肯定压力比较大。不过,懒人自有懒的办法,可以选择
wtforms package提供的表单功能以及继承flask admin提供的模板很轻松就实现了产生表单页面的功能。
并且flask admin的官网上是极力推荐继承或者直接使用flask admin提供的模板。这样,一个可以保持自定义视图和
自己使用flask admin的sqla.ModelView视图样式保持一直,另外就是可以复用现成的东西释放劳动力。
对于想要继承flask admin的模板,可以自己看下flask admin具体渲染相关的逻辑就一目了然了,还是蛮直观的。
对于不太想看源代码的,可以理解为flask admin package目录下的templates/bootstrap3/admin(具体是bootstrap3还是bootstrap2需要依据自己的需求)目录下的模板都是可继承的,
具体想继承哪个看自己的需求。
如何使用wtforms
使用wtforms还是挺简单的,直接继承form.Form类就可以了
下面用一个例子介绍下
from wtforms import form, fields, validators, widgets
from wtforms.ext.sqlalchemy.fields import QuerySelectField
class MyForm(form.Form):
args = fields.TextField(label=u'脚本参数')
timeout = fields.IntegerField(label=u'超时时间', default=)
以上定义了一个表单,有两个元素,args和timeout,不过在页面具体显示时并没有看到args和timeout。取而代之的是脚本参数和超时时间。
这是因为指定了label,这样表单对应元素显示就显示label的值。
具体在flask admin application中想要把对应的页面渲染出来,只需要用以下语句就可以了:
@expose('/<your_url>', methods = ['GET', 'POST'])
def index(self):
form = MyForm(request.form)
if request.method == 'POST':
if helpers.validate_form_on_submit(from):
# do you logical
return self.render('admin/file/form.html', form = form)
以上只是一个很简洁的相关代码,还是很简洁的。admin/file/form.html是直接使用flask admin提供的模板,直接使用就可以了。
使用上面简短几行代码就可以渲染出一个完整的表单来。对于简单的应用场景,使用以上所讲的就已经能够完全满足需求了。
不过,很多时候表单需要有下拉列表框,需要从数据库中查询数据来做具体的选择。这样的话,就需要涉及数据库,涉及到多选列表框
flask admin多选列表框元素的使用也是蛮简单的
choices = [('line', u'线形图'), ('pie', u'饼状图'), ('column', u'直方图'), ('bar', u'条形图')]
chart_type = fields.SelectField(label=u'类型', choices=choices)
也像上面定义的表单的args参数和timeout参数一样,使用SelectField还是蛮简单的。
wtforms 支持从数据库中获取数据
fields.SelectField可供使用的数据来源不仅可以是预定义的,也可以是从数据库中查询。
tasks = [(r.task_name, r.task_name) for r in db.session.query(Task).all()]
task = fields.SelectField(label=u'发布任务',
validators = [validators.required()], choices = tasks)
这样就可以很方便的从数据库中查询到所有的记录,并作为下拉列表框中的选项供使用者选择。
使用SelectField存在的问题
不过严格来说,上述的场景并不是很适合用SelectField。因为在使用过程中会发现即使Task中的数据一直在更新而下拉列表框中的记录永远不变。
主要原因是task是表单类中的一个静态成员,定义之后就保持不变。因此,即使Task表中的数据一直在变,但是tasks的结果是已经固定的。
使用QuerySelectField
解决的办法还是有的,就是使用QuerySelectField,QuerySelectField并不在wtforms.fields文件中,所以导致我们我们并不知道它的存在。而且wtforms的官网也推荐我们
用SelectField支持从数据库中获取记录,导致我们误以为可以那么使用,我忽略了QuerySelectField。
QuerySelectField的使用
from wtforms.ext.sqlalchemy.fields import QuerySelectField class MyForm(form.Form):
def query_factory():
return [r.name for r in db.session.query(Script).all()] def get_pk(obj):
return obj name = QuerySelectField(label=u'脚本名', validators=[validators.required()], query_factory=query_factory, get_pk=get_pk)
QuerySelectField使用起来也是蛮简单的,不过需要提供两个函数,query_factory和get_pk这两个函数。上例中的两个函数是根据我自身使用的场景来
使用的,name是Script表的主键。所以,上例中能够动态获取Script表中的主键内容。下拉列表框的内容跟着Script表的数据变化在变化。刚好符合我们的需求。
结论
flask admin还是蛮强大的,越是到后面会发现很多意想不到的东西。要坚持不断学习,不要妥协!
flask-admin章节二:wtforms的使用以及在数据库场景中使用QuerySelectField代替SelectField的更多相关文章
- flask admin学习记录
flask admin是flask框架中一个非常好用的后台管理框架,但是由于文档内容太少,经常遇到问题无法解决,这里记录一下 一简单的使用 from flask import Flask from f ...
- Flask框架(二)—— 反向解析、配置信息、路由系统、模板、请求响应、闪现、session
Flask框架(二)—— 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 目录 反向解析.配置信息.路由系统.模板.请求响应.闪现.session 一.反向解析 1.什么是反向解析 ...
- Flask 学习篇二:学习Flask过程中的记录
Flask学习笔记: GitHub上面的Flask实践项目 https://github.com/SilentCC/FlaskWeb 1.Application and Request Context ...
- Flask admin Flask login 整合模板
项目地址: https://github.com/WES6/supflask Flask admin 官方文档: https://flask-admin.readthedocs.io/en/lates ...
- Java进阶(二十五)Java连接mysql数据库(底层实现)
Java进阶(二十五)Java连接mysql数据库(底层实现) 前言 很长时间没有系统的使用java做项目了.现在需要使用java完成一个实验,其中涉及到java连接数据库.让自己来写,记忆中已无从搜 ...
- 一、数据库表中字段的增删改查,二、路由基础.三、有名无名分组.四、多app共存的路由分配.五、多app共存时模板冲突问题.六、创建app流程.七、路由分发.八、路由别名,九、名称空间.十、反向解析.十一、2.x新特性.十二、自定义转换器
一.数据库表中字段的增删改查 ''' 直接在modules中对字段进行增删改查 然后在tools下点击Run manage.py Task执行makemigrations和migrate 注意在执行字 ...
- 二、消息队列之如何在C#中使用RabbitMQ(转载)
二.消息队列之如何在C#中使用RabbitMQ 1.什么是RabbitMQ.详见 http://www.rabbitmq.com/. 作用就是提高系统的并发性,将一些不需要及时响应客户端且占用较多资源 ...
- Android插件化(二):使用DexClassLoader动态载入assets中的apk
Android插件化(二):使用DexClassLoader动态载入assets中的apk 简单介绍 上一篇博客讲到.我们能够使用MultiDex.java载入离线的apk文件.须要注意的是,apk中 ...
- 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs
原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...
随机推荐
- FreeMark学习(三)
沉淀的心 freemarker学习笔记--设计指导 <# ... > 中存放所有freemaker的内容,之外的内容全部原样输出.<@ ... /> 是函数调用两个定界 ...
- ReactJS学习笔记(三)
需要注意的问题: 1.组件名称开头字母一定要大写.(PS:原因是 React 的 JSX 里约定分别使用首字母大.小写来区分本地组件的类和 HTML 标签.) 2.this.props.childre ...
- Mysql 相关字段类型长度
1. Compact行记录是在MySQL 5.0时被引入的,其设计目标是能高效存放数据. 2. Redundant是MySQL 5.0版本之前InnoDB的行记录存储方式. 3. InnoDB存 ...
- ActiveMQ安装
安装环境: 逛网下载最新安装包,ubuntu下解压sudo tar -zxvf xx.tar.启动activeMQ. 报错如下: 原因是没有找到java命令位置,编辑启动配置文件: 再次启动,完成后进 ...
- linux top命令中各cpu占用率含义
linux top命令中各cpu占用率含义 [尊重原创文章摘自:http://www.iteye.com/topic/1137848]0.3% us 用户空间占用CPU百分比 1.0% sy 内核空间 ...
- tp框架总结(三)
一.跨模块的调用 class IndexAction extends Action{ public function index(){ $user = new UserAction(); // 类 ...
- Find the largest K numbers from array (找出数组中最大的K个值)
Recently i was doing some study on algorithms. A classic problem is to find the K largest(smallest) ...
- oracle 触发器学习
触发器使用教程和命名规范 目 录触发器使用教程和命名规范 11,触发器简介 12,触发器示例 23,触发器语法和功能 34,例一:行级触发器之一 45,例二:行级触发器之二 46,例三:INSTEA ...
- MyEclipse 8.5汉化教程
汉化包下载:http://yunpan.cn/QIUaVS2CU5wCd 1.解压MyEclipse中的language文件夹 以我的安装目录为例,我的MyEclipse8.5的安装在D:盘下.将解压 ...
- 《IT蓝豹》完整阅读软件客户端app
完整阅读软件客户端app,本项目里面还有扫描功能,搜索本地书籍,不过扫码功能通过c++层实现的. 本项目来自:https://github.com/JayFang1993/ScanBook Captu ...