目录
- 地址: https://flask-admin.readthedocs.io/en/latest/
一: Flask_Admin基础功能
1.1: 初始化空的管理界面:
- 主题地址: http://bootswatch.com/3/
# coding=utf-8
from flask import Flask
from flask_admin import Admin
app = Flask(__name__)
# 设置Flask_admin样式
app.config['FLASK_ADMIN_SWATCH'] = 'cerulean'
# 初始化admin对象,绑定app对象,指定模板
admin = Admin(app, name='microblog', template_mode='bootstrap3')
app.run()
- 运行效果:
1.2: 添加模型类视图:
-
1:使用FLASK_SQLAlchemy创建一个模型类: 设备版本表
# coding=utf-8 from sqlalchemy.orm import registry from sqlalchemy import Column, String, Integer my_registry = registry() # 获取模型类基类 Base = my_registry.generate_base() class UpdateDeviceVersionClass(Base): """ 更新设备版本表 """ __tablename__ = "update_device_version" id = Column(Integer, autoincrement=True, primary_key=True, unique=True, nullable=False) device_name = Column(String(64), nullable=False) rule_version = Column(String(32), nullable=True) ioc_version = Column(String(32), nullable=True) sys_version = Column(String(32), nullable=True) product_id = Column(Integer, nullable=False)
-
2: 添加模型类视图:
- 该模型类视图,拥有CRUD的全部属性。
# coding=utf-8 from flask import Flask from flask_admin import Admin from flask_admin.contrib.sqla import ModelView from sqlalchemy import create_engine from sqlalchemy.orm import Session import config from modules import UpdateDeviceVersionClass app = Flask(__name__) # 设置Flask_admin样式 app.config['FLASK_ADMIN_SWATCH'] = 'cerulean' # 初始化admin对象,绑定app对象,指定模板 admin = Admin(app, name='microblog', template_mode='bootstrap3') engin = create_engine(config.DB_URI) session = Session(engin) # 直接构造模型类视图 admin.add_view(ModelView(UpdateDeviceVersionClass, session)) app.run()
-
效果:
1.3: 向索引页添加内容:
-
在templates/admin/index.html中添加下面的内容:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> {% extends 'admin/master.html' %} {% block body %} <p>请联系管理员:任善文</p> {% endblock %} </body> </html>
-
索引页效果:
1.4: 自定义内置视图:
-
1: 再次定义一个模型类,继承于ModelView。
- 设置取消删除权限,并且设置每页数量为50。
# 注意导包,千万不要导错。 from flask_admin.contrib.sqla import ModelView class UpdateDeviceVersionModuleClass(ModelView): """ 设置不能删除,每页50字段 """ can_delete = False page_size = 50
- 使用这个内置视图去封装原来的模型类,然后加入到视图集中。
# 直接构造模型类视图 admin.add_view(UpdateDeviceVersionModuleClass(UpdateDeviceVersionClass, session))
-
2: 自定义视图有那些属性呢?
# 是否能创建 can_create = False # 是否能修改 can_edit = False # 是否可以删除 can_delete = False # 设置查看更多详细信息 can_view_details = True # 删除某列不显示 column_exclude_list = ['password', ] # 使用搜索栏,用于过滤指定的字段 column_searchable_list = ['name', 'email'] # 搜索中的限制字段 column_filters = ['country'] # 弹窗的形式展示创建和编辑 create_modal = True edit_modal = True
-
3: 案例: 设置可以查看更多信息,不显示ID字段, 设置过滤字段sys_version,设置创建和编辑都是弹窗形式展示。
class UpdateDeviceVersionModuleClass(ModelView): """ 设置不能删除,每页50字段 """ can_delete = False page_size = 50 column_searchable_list = ['device_name'] column_exclude_list = ['id'] column_filters = ['sys_version'] create_modal = True edit_modal = True can_view_details = True
- 效果:
-
4: 限制文本字段的选项:
-
案例: 限制产品的ID只能是1, 2, 3, 4。
class UpdateDeviceVersionModuleClass(ModelView): ... form_choices = { 'product_id': [ (1, "1"), (2, "2"), (3, "3"), (4, "4") ] }
-
效果:
-
-
5: 从创建和删除表单中删除某些字段,不让用户添加
-
案例: 不让用户添加ID字段。
form_excluded_columns = ['id']
-
-
6: 配置文件导出:
-
案例: 配置导出文件:
can_export = True
-
效果:
-
-
7: 指定表单的相关参数:
-
案例: 设置device_name表单名字为device,参数必传。
form_args = { "device_name": { "label": "device", 'validators': [required()] } }
-
-
8:更改表单的样式:
-
案例: 设置device_name的样式为红色:
form_widget_args = { 'device_name': { 'rows': 10, 'style': 'color: red' } }
-
效果:
-
-
9: 加载相关对象模型:
form_ajax_refs = { 'user': { 'fields': ['first_name', 'last_name', 'email'], 'page_size': 10 } }
- 对相关对象加载的数据进行过滤:
form_ajax_refs = { 'active_user': QueryAjaxModelLoader('user', db.session, User, filters=["is_active=True", "id>1000"]) }
1.5: 分组视图:
-
添加视图的时候,使用category参数,可以将视图组合在一起。
-
案例:
新增一个设备信息的模型类和视图类:
class UnifyDeviceClass(Base): """ 设备信息模型类 """ __tablename__ = 'unify_device' # 表结构 id = Column(Integer, autoincrement=True, primary_key=True, unique=True, nullable=False) name = Column(String(255), nullable=False) serial = Column(String(255), nullable=False) product_id = Column(Integer, nullable=True) ip = Column(String(64), nullable=True) group_id = Column(Integer, nullable=True) maker_id = Column(Integer, nullable=True) rule_version = Column(String(32), nullable=True) ioc_version = Column(String(32), nullable=True) sys_version = Column(String(32), nullable=True) beat_time = Column(Integer, nullable=True) create_time = Column(Integer, nullable=False) is_delete = Column(Integer, nullable=True) class UnifyDeviceView(ModelView): can_delete = False page_size = 50
-
将这两个视图,分成一个组。
admin.add_view(UpdateDeviceVersionModuleClass(UpdateDeviceVersionClass, session, category="module")) admin.add_view(UnifyDeviceView(UnifyDeviceClass, session, category="module"))
-
效果:
-
-
菜单中可以加入超链接:
-
例如: 加入一个超链接,名为Home Page直接链接到首页:
admin.add_link(MenuLink(name='Home Page', url='/admin', category='Links'))
-
效果:
-
-
下拉列表中再嵌套一个相关视图:
admin.add_sub_category(name="Links", parent_name="Team")
1.6: 添加自己的视图:
-
1: 自定义视图:
from flask_admin import BaseView, expose class AnalyticsView(BaseView): @expose('/') def index(self): return self.render('analytics_index.html')
-
2: 自定义html文件
- 注意:必须将这个自定义的html放在templates下面,而不能放在admin下面。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Analytics</title> </head> <body> {% extends 'admin/master.html' %} {% block body %} <p>Here I'm going to display some data.</p> {% endblock %} </body> </html>
1.7: 覆盖内置视图:
from flask_admin.contrib.sqla import ModelView
# Flask and Flask-SQLAlchemy initialization here
class UserView(ModelView):
@expose('/new/', methods=('GET', 'POST'))
def create_view(self):
"""
Custom create view.
"""
return self.render('create_user.html')
1.8: 内置模板:
-
在内部,我们所有的模板都是来自于: admin/master.html模板。
-
我们经常要扩展出: list.html, create.html,edit.html三个模板。
-
案例: 拓展一个编辑模板: templates/microblog_edit.html
{% extends 'admin/model/edit.html' %} {% block body %} <h1>MicroBlog Edit View</h1> {{ super() }} {% endblock %}
在使用模板的视图中增加编辑模板的属性:
class MicroBlogModelView(ModelView): edit_template = 'microblog_edit.html' # create_template = 'microblog_create.html' # list_template = 'microblog_list.html'