Flask - admin 快速入门

滕鸿畴
2023-12-01

总结

  • 快速高效的设置后台数据管理
  • 支持,查询,导出功能
  • 不支持数据导入管理
  • 最高效的学习方式,直接看后台源码

常见问题场景

  • 对页面进行汉化
  • 自定义页面
  • 自定义模型页面
  • 自定模型页面中列的数据格式和内容
  • 添加搜索/全文过滤

1 页面汉化

  1. 安装 Flask-BabelEx (cmd 中 输入 pip install Flask-BabelEx)
  2. 在代码中添加如下代码段:
from flask_babelex import Babel

#------------------
#@param app:flask app 程序

babel = Babel(app)
@babel.localeselector
def get_locale():
    <!--override = request.args.get('lang')-->
    <!--if override:-->
    <!--    session['lang'] = override-->
    <!--return session.get('lang', 'zh_Hans_CN')-->
    return session.get('lang','zh_Hans_CN')

2 自定义页面

from flask_admin import expose,Admin,AdminIndexView

class FruitView(AdminIndexView):
    @expose('/')
    def index(self):
        arg1 = 'home'
        if current_user.is_authenticated and current_user.username =='admin':
            #adminIndex.html 为与 app 的 static 文件夹下面
            #其可继承任何jinja 模板
            return self.render('adminIndex.html',arg1=arg1)
        else:
            return jsonify(u"请用管理员帐户登录")

class MyView(BaseView):
    @expose('/')
    def index(self):
        arg1 = 'home'
        if current_user.is_authenticated and current_user.username =='admin':
            return self.render('adminIndex.html',arg1=arg1)
        else:
            return jsonify(u"请用管理员帐户登录")

#使用自己重写的 Home view 来重置了库中原本提供的Home view
#@param url ='/admin' 系统默认的,可以自己修改,设置的内容等同于
#admin = Blueprint('admin', __name__, url_prefix='/admin')
#即该模块下的所有url 地址都将使用 url 来作为前缀
admin = Admin(app,name=u'后台管理',index_view=FruitView())

#添加页面
admin.add_view(MyView(name='RootView'))

#添加下拉页面
admin.add_view(MyView(name='Hello 1', endpoint='test1', category='Subview'))

3 自定义模型页面

模型页面为flask-admin 的特殊功能,里面加入了 创建,编辑,删除,导出,搜索等数据管理功能

操作类型有:
* can_create / can_edit / can_delete / can_export / 当以上标记设置为 True的时候 ,在模型页面中就能显示相关的按钮

控制类型:
* 筛选 column_searchable_list = [‘id’, ‘date’,’tickets’]
* 搜索 column_filters = column_searchable_list

字段汉化:
* 设置字段的映射表 column_labels=dict()
* 设置具体字段显示的内容 : column_formatters = dict()
* 在页面初始化的时候会从 column_labels 获取显示的列名称。在显示数据的时候 会使用 column_formatters 来格式化列中的数据列

class BaseModelView(ModelView):
    """ 模型视图基类 """
    def is_accessible(self):
        return current_user.is_authenticated and current_user.username =='admin'
    column_display_pk   = True   #在页面中是否显示主键
    can_create          = False
    can_view_details    = True
    can_export          = True
    column_searchable_list = ['id', 'date','tickets']
    column_filters      = column_searchable_list
    column_labels       = {
        'id': u'编号'
    }
    #设置每个列的显示数据的格式化
    column_formatters = {
        'date' : lambda v, c, m, p: ("%s"%m.date).split(" ")[0],
        'operator_id':lambda v, c, m, p:get_name(m.operator_id),
    }

class MyModelView(BaseModelView):
    """具体的模型视图"""
    column_labels = copy.deepcopy(BaseModelView.column_labels)
    column_searchable_list = copy.deepcopy(BaseModelView.column_searchable_list)
    column_searchable_list.extend(["name",'support_id','isout'])
    column_filters = column_searchable_list
    column_labels.update({
        'name':u"品名"
    }

#@param stock: 具体的 orm 对象
#@param name:显示在页面上按钮的文字
#@param database.session: 数据库会话

admin = Admin(app,name=u'后台管理',index_view=FruitView())
admin.add_view(StockModelView(stock, database.session,name=u'入库'))
![后台管理页面视图](http://img.blog.csdn.net/20161225152741909?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzc0NjQ4Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
 类似资料: