adminLTE的自动化菜单
from django.db import models # Create your models here.
class MenuInfo(models.Model):
parent = models.ForeignKey('MenuInfo', blank=True, null=True)
name = models.CharField('菜单名称', max_length=15)
menu_icon = models.ForeignKey('IconInfo', verbose_name='图标')
url = models.CharField('网址', max_length=100, blank=True, null=True)
show = models.BooleanField('是否显示', default=False)
priority = models.IntegerField(verbose_name=u'显示优先级', null=True, blank=True, default=-1) class Meta:
db_table = 'MenuInfo' class IconInfo(models.Model):
DisplayName = models.CharField(max_length=100)
ClassName = models.CharField(max_length=100)
SourceType = models.CharField(max_length=100)
CreateTime = models.DateTimeField(auto_created=True) class Meta:
db_table = 'IconInfo'
model的代码
二.
模板中间件
1.setting的设置
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'adminLTE.context_processors.make_menus_processor',
],
'builtins': [ # Add this section
"debugtools.templatetags.debugtools_tags", # Add this line
],
},
},
]
setting的设置
2.中间件的代码
2.1设置了一个全局变量,这样方便设置菜单的active的选中状态
from django.utils.html import format_html
from menuInfo.models import MenuInfo menu_active = '' def make_menus_html(menus, parent_id=None, current_parent_id=None, active=None):
"""
menus = Menus.objects.all()
:param menus: 寻找的对象,传一个queryset对象
:param parent_id: 父级菜单ID
:param current_parent_id: 当前父级菜单ID
:param active: 激活的菜单名
:return:
"""
make_html = ""
for menu in menus:
child_menu_flag = "treeview"
menu_right_flag = '<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>'
child_menu = '<li class="{active}"><a href="{menu_url}"><i class="fa fa-circle-o"></i> {menu_name}</a></li>'
child_menu_html = '<ul class="treeview-menu">{make_child_menu_html}</ul>'
master_menu_html = """
<li class="{child_menu_flag} {active}">
<a href="{menu_url}"><i class="fa {menu_icon}"></i> <span>{menu_name}</span>{menu_right_flag}</a>
<ul class="treeview-menu">
{children_menu_html}
</ul>
</li>"""
children_menu_html = """
<li class="treeview">
<a href="{menu_url}"><i class="fa fa-circle-o"></i> <span>{menu_name}</span>{menu_right_flag}</a>
{child_menu_html}
</li>"""
parent = menu.parent # 获取当前菜单的父级菜单
if current_parent_id == menu.id or (not parent and current_parent_id):
continue # 如果当前父级菜单ID是自己或没有父级菜单且有当前父级ID则跳过本次循环
if not parent and current_parent_id is None: # 如果没有父级菜单且当前父级ID是None
make_children_menu_html = make_menus_html(menus, parent_id=parent_id, current_parent_id=menu.id)
if not make_children_menu_html:
menu_right_flag = ''
menu_icon = menu.menu_icon.ClassName
if hasattr(menu, 'icon_name'):
menu_icon = menu.icon_name
active = menu_active.split('/')[1]
active = '/%s/' % active
if menu.url == active:
active_menu = 'active'
else:
active_menu = ''
make_master_menu_html = master_menu_html.format(child_menu_flag=child_menu_flag,
active=active_menu,
menu_url=menu.url,
menu_icon=menu_icon,
menu_name=menu.name,
menu_right_flag=menu_right_flag,
children_menu_html=make_children_menu_html)
make_html += make_master_menu_html
elif parent and current_parent_id == parent.id: # 如果有父级且当前父级ID是自己的父级ID4
make_child_menu_html = make_menus_html(menus, parent_id=current_parent_id, current_parent_id=menu.id)
if make_child_menu_html:
child_menu_html = child_menu_html.format(make_child_menu_html=make_child_menu_html)
children_menu_html = children_menu_html.format(menu_url=menu.url,
menu_name=menu.name,
menu_right_flag=menu_right_flag,
child_menu_html=child_menu_html)
else:
if menu.url == menu_active:
active_menu = 'active'
else:
active_menu = ''
children_menu_html = child_menu.format(menu_url=menu.url, menu_name=menu.name, active=active_menu)
make_html += children_menu_html
else:
continue
return make_html def make_menus_processor(request):
menus_obj = MenuInfo.objects.filter(show=0)
global menu_active
menu_active = request.path
menus = make_menus_html(menus=menus_obj, active=menu_active)
return {'menus': format_html(menus)}
模板中间件代码
adminLTE的自动化菜单的更多相关文章
- 用C#从数据库动态生成AdminLTE菜单的一种方法
当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://g ...
- yii2 rbac权限控制之菜单menu详细教程
作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...
- yii2权限控制rbac之菜单menu最详细教程
前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...
- teprunner测试平台用例前置模块开发
本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...
- SharePoint自动化系列——Site/Web/List级别的导航菜单
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 需求:在不同的测试用例中,对脚本中不确定的因素需要和用户交互来确定,比如选择哪个site,选择哪个 ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第十节--AdminLTE模板菜单处理
上节我们把布局页,也有的临时的菜单,但是菜单不是应该动态加载的么?,所以我们这节来写菜单.首先我们看一下AdminLTE源码里面的菜单以及结构. <aside class="main- ...
- ABP+AdminLTE+Bootstrap Table权限管理系统第九节--AdminLTE引入及模板页和布局和菜单
返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 AdminLTE AdminLTE 官网地址:https://adminlte.io/themes/AdminLT ...
- 修改AdminLTE左侧菜单展开延迟
AdminLTE左侧菜单展开会有半秒钟的延迟. 看起来会慢半拍. 可修改 admin/dist/js/app.min.js中的 animationSpeed值(默认为500) 如下:
- adminlte+layui框架搭建2 - 动态菜单
动态菜单 参考文章:https://cloud.tencent.com/developer/article/1342558 主要修改两个地方: 1.系统初始化加载一级菜单,在adminlte.js文件 ...
随机推荐
- 【Oracle】oracle利用正则表达式拆分IP地址
使用oracle提供的regexp_substr()函数,对将IPV4地址分成4段: select v.ip as ip_address, regexp_substr(v.ip,,) as A, re ...
- [转]netty对http协议解析原理
本文主要介绍netty对http协议解析原理,着重讲解keep-alive,gzip,truncked等机制,详细描述了netty如何实现对http解析的高性能. 1 http协议 1.1 描述 标示 ...
- web项目绝对路径与相对路径的问题
1.绝对路径:就是一个文件url的全部或者磁盘完整的物理地址;例如 http://localhost:8080/navigation/a.jsp就是a.jsp的绝对路径,再例如 D:\TC\a.jsp ...
- JS:事件对象1
一,this关键字和上下文 var box = document.getElementById("box");. 普通的函数如果没有给他传递参数,函数本身是没有参数的. test( ...
- JavaScript第一天
1.静态的网页技术和动态的网页技术 静态网页是相对于动态网页而言,是指没有后台数据库.不含程序和不可交互的网页.你编的是什么它显示的就是什么.不会有任何改变.静态网页相对更新起来比较麻烦,适用于一般更 ...
- comebotree树
comebotree树: java: @RequestMapping(value="/combobox.do") public @ResponseBody String combo ...
- 通过hexo+NexT构建静态博客
一般的教程网上有很多,主要讲下我遇到的问题以及解决方法: 一.hexo建立的文档无法上传github deploy: type: git repository: https://github.com/ ...
- 实战Java虚拟机之四:提升性能,禁用System.gc() ?
今天开始实战Java虚拟机之四:"禁用System.gc()". 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟 ...
- 实验五(简单嵌入式WEB服务器实验)问题总结
实验五问题总结 问题链接:<信息安全系统设计基础>实验五实验报告 虽然将07_httpd文件中全部拷贝进了bc中,文件夹中拥有Makefile文件,但是还是无法通过make得到该文件夹中c ...
- spring接收json格式的多个对象参数(变通法)
两种方法 方法1 如果使用spring mvc同客户端通信,完全使用json数据格式,需要如下定义一个RequestMapping @Controller public class TestContr ...