flask-admin 非自定义modelview下扩展默认视图(base.html)

news/2025/1/10 14:12:59/

背景

在默认视图下实现某些统一的业务需求,如想改变默认视图的某些样式等。本文想阐述的是在默认视图下添加“面包屑”效果

材料:

制作:

目标:

1、在不重构的情况下实现如下效果

2、上源码

      {% if admin_view.category %}<div class="row" style="    margin-left: 0px;margin-right: 0px;"><ol class="breadcrumb">{% if admin_view.category %}<li>{{ admin_view.category }}</li> {% endif %}{% if admin_view.name %}<li class="active">{{ admin_view.name }}</li>{% endif %}</ol></div>{% endif %}

思路与技巧 

1、想要全局修改默认视图效果就需要对源码视图进行覆盖,其实flask-admin 为我们实现这个目标提供了非常优秀的支持。

a、想修改modelview 下默认的列表视图只需要在自己工程目录的templates目录下新建admin/list.html (内容直接根据自己的版本从源码中复制过来即可,如:https://github.com/pallets-eco/flask-admin/blob/v1.6.1/flask_admin/templates/bootstrap3/admin/base.html) 

b、自定义视图 baseview 就非常自由,但也需要你做更多的事情,不过建议每个视图继承{% extends 'admin/master.html' %} ,这样至少风格与默认的modelview一致,方便灵活使用,当然也省去了自己引入js和bootsrtap的麻烦

c、如果要在默认的视图中添加公共组件,我们只需要修改默认视图的公共类即可,那便是base.html,源码位置:

d、base.html 内容如下:(直接从源码库获得)

{% import 'admin/layout.html' as layout with context -%}
{% import 'admin/static.html' as admin_static with context %}
<!DOCTYPE html>
<html><head><title>{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}</title>{% block head_meta %}<meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content=""><meta name="author" content="">{% endblock %}{% block head_css %}<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/swatch/{swatch}/bootstrap.min.css'.format(swatch=config.get('FLASK_ADMIN_SWATCH', 'default')), v='3.3.5') }}" rel="stylesheet">{%if config.get('FLASK_ADMIN_SWATCH', 'default') == 'default' %}<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap-theme.min.css', v='3.3.5') }}" rel="stylesheet">{%endif%}<link href="{{ admin_static.url(filename='admin/css/bootstrap3/admin.css', v='1.1.1') }}" rel="stylesheet"><link href="{{ admin_static.url(filename='admin/css/bootstrap3/submenu.css') }}" rel="stylesheet">{% if admin_view.extra_css %}{% for css_url in admin_view.extra_css %}<link href="{{ css_url }}" rel="stylesheet">{% endfor %}{% endif %}<style>body {padding-top: 4px;}</style>{% endblock %}{% block head %}{% endblock %}{% block head_tail %}{% endblock %}</head><body>{% block page_body %}<div class="container{%if config.get('FLASK_ADMIN_FLUID_LAYOUT', False) %}-fluid{% endif %}"><nav class="navbar navbar-default" role="navigation"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#admin-navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>{% block brand %}<a class="navbar-brand" href="{{ admin_view.admin.url }}">{{ admin_view.admin.name }}</a>{% endblock %}</div><!-- navbar content --><div class="collapse navbar-collapse" id="admin-navbar-collapse">{% block main_menu %}<ul class="nav navbar-nav">{{ layout.menu() }}</ul>{% endblock %}{% block menu_links %}<ul class="nav navbar-nav navbar-right">{{ layout.menu_links() }}</ul>{% endblock %}{% block access_control %}{% endblock %}</div></nav>{% block messages %}{{ layout.messages() }}{% endblock %}{# store the jinja2 context for form_rules rendering logic #}{% set render_ctx = h.resolve_ctx() %}{% block body %}{% endblock %}</div>{% endblock %}{% block tail_js %}<script src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='bootstrap/bootstrap3/js/bootstrap.min.js', v='3.3.5') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.22.2') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='admin/js/helpers.js', v='1.0.0') }}" type="text/javascript"></script>{% if admin_view.extra_js %}{% for js_url in admin_view.extra_js %}<script src="{{ js_url }}" type="text/javascript"></script>{% endfor %}{% endif %}{% endblock %}{% block tail %}{% endblock %}</body>
</html>

e、在上述代码中添加面包屑代码即可(修改后的代码如下)

{% import 'admin/layout.html' as layout with context -%}
{% import 'admin/static.html' as admin_static with context %}
<!DOCTYPE html>
<html><head><title>{% block title %}{% if admin_view.category %}{{ admin_view.category }} - {% endif %}{{ admin_view.name }} - {{ admin_view.admin.name }}{% endblock %}</title>{% block head_meta %}<meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content=""><meta name="author" content="">{% endblock %}{% block head_css %}<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/swatch/{swatch}/bootstrap.min.css'.format(swatch=config.get('FLASK_ADMIN_SWATCH', 'default')), v='3.3.5') }}" rel="stylesheet">{%if config.get('FLASK_ADMIN_SWATCH', 'default') == 'default' %}<link href="{{ admin_static.url(filename='bootstrap/bootstrap3/css/bootstrap-theme.min.css', v='3.3.5') }}" rel="stylesheet">{%endif%}<link href="{{ admin_static.url(filename='admin/css/bootstrap3/admin.css', v='1.1.1') }}" rel="stylesheet"><link href="{{ admin_static.url(filename='admin/css/bootstrap3/submenu.css') }}" rel="stylesheet">{% if admin_view.extra_css %}{% for css_url in admin_view.extra_css %}<link href="{{ css_url }}" rel="stylesheet">{% endfor %}{% endif %}<style>body {padding-top: 4px;}</style>{% endblock %}{% block head %}{% endblock %}{% block head_tail %}{% endblock %}</head><body>{% block page_body %}<div class="container{%if config.get('FLASK_ADMIN_FLUID_LAYOUT', False) %}-fluid{% endif %}"><nav class="navbar navbar-default" role="navigation"><!-- Brand and toggle get grouped for better mobile display --><div class="navbar-header"><button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#admin-navbar-collapse"><span class="sr-only">Toggle navigation</span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button>{% block brand %}<a class="navbar-brand" href="{{ admin_view.admin.url }}">{{ admin_view.admin.name }}</a>{% endblock %}</div><!-- navbar content --><div class="collapse navbar-collapse" id="admin-navbar-collapse">{% block main_menu %}<ul class="nav navbar-nav">{{ layout.menu() }}</ul>{% endblock %}{% block menu_links %}<ul class="nav navbar-nav navbar-right">{{ layout.menu_links() }}</ul>{% endblock %}{% block access_control %}{% endblock %}</div></nav>{% if admin_view.category %}<div class="row" style="    margin-left: 0px;margin-right: 0px;"><ol class="breadcrumb">{% if admin_view.category %}<li>{{ admin_view.category }}</li> {% endif %}{% if admin_view.name %}<li class="active">{{ admin_view.name }}</li>{% endif %}</ol></div>{% endif %}{% block messages %}{{ layout.messages() }}{% endblock %}{# store the jinja2 context for form_rules rendering logic #}{% set render_ctx = h.resolve_ctx() %}{% block body %}{% endblock %}</div>{% endblock %}{% block tail_js %}<script src="{{ admin_static.url(filename='vendor/jquery.min.js', v='3.5.1') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='bootstrap/bootstrap3/js/bootstrap.min.js', v='3.3.5') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='vendor/moment.min.js', v='2.22.2') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='vendor/select2/select2.min.js', v='3.5.2') }}" type="text/javascript"></script><script src="{{ admin_static.url(filename='admin/js/helpers.js', v='1.0.0') }}" type="text/javascript"></script>{% if admin_view.extra_js %}{% for js_url in admin_view.extra_js %}<script src="{{ js_url }}" type="text/javascript"></script>{% endfor %}{% endif %}{% endblock %}{% block tail %}{% endblock %}</body>
</html>

 

 

 

 

 


http://www.ppmy.cn/news/1561992.html

相关文章

C#中 string.Equals 和 == 区别

在 C# 中&#xff0c;string.Equals方法和运算符都可用于比较字符串&#xff0c;但它们在某些方面存在区别&#xff0c;主要如下&#xff1a; **string.Equals方法&#xff1a;**是一个实例方法&#xff0c;用于比较两个字符串对象的内容是否相等&#xff0c;比较时会根据字符…

QT笔记- QTableWidget移动行

QTableWidget * tw ui->tableWidget;// 保存要移动的行的数据QList<QTableWidgetItem *> items;for(int i 0; i < 2; i){QTableWidgetItem * C0Item;QTableWidgetItem * C1Item;QTableWidgetItem * C2Item;int removeRow -1;for(int row 0; row < tw->ro…

Android studio gradle与gradle插件

最终换gradle版本&#xff0c;糊成一坨。 记录一下 Android studio里有两个容易搞混&#xff0c;记载一下。 build.gradle文件中的为插件版本&#xff1a; classpath "com.android.tools.build:gradle:3.5.0" gradle.properties里的才是gradle版本。 distributio…

飞书企业消息实践

一、飞书自带的消息机器人限制 频控策略 - 服务端 API - 飞书开放平台 自定义机器人的频率控制和普通应用不同&#xff0c;为单租户单机器人 100 次/分钟&#xff0c;5 次/秒。建议发送消息尽量避开诸如 10:00、17:30 等整点及半点时间&#xff0c;否则可能出现因系统压力导致…

什么是数据湖?大数据架构的未来趋势

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

JS控制对应数据隐藏

首先需要获得到所有的input框&#xff0c;并声明一个空对象来存放&#xff0c;遍历所有的复选框&#xff0c;将他们中选中的放入对象&#xff0c;并设置键值为true&#xff0c;然后执行checkFalseValues(result)函数 function hideItem() {let checkboxes $(.setting_box inp…

(二)最长公共子序列、最长上升子序列、最大子段和、三角形最小路径和、矩阵连乘、0-1背包

最近刚考完算法设计分析课的考试&#xff0c;复习总结一下期末考试的几道算法题吧 目录 LCR 095. 最长公共子序列 300. 最长递增子序列 53. 最大子数组和 LCR 100. 三角形最小路径和 矩阵连乘问题 0-1背包 LCR 095. 最长公共子序列 给定两个字符串 text1 和 text2&#xff…

【linux进程间通信(1)】匿名管道和命名管道

目录 前言1. 进程间通信的方法2. 管道的简单介绍3. 匿名管道4. 命名管道5. 总结 前言 众所周知,进程运行是具有独立性的,想要进程间进行通信就要打破这种独立性,而进程间通信的本质其实是让不同的进程看见同一份资源! 本章重点: 本篇文章会介绍进程间通信中常见的几种方式,并…