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文件 ...
随机推荐
- C# 五、谈扩展方法的理解
http://www.cnblogs.com/zhaopei/p/5678842.html
- 如何转换WMV到MP3,WMV到MP3播放器
非常好的软件!!!!!没有注册,可以用.推荐给大家! http://www.daniusoft.com/cn/convert-wmv/wmv-to-mp3.html http://hi.baidu.c ...
- zorka源码解读之Instrument实现原理
主要用到三方面技术: beanshell来实现可扩展:告诉zorkaAgent插桩的具体需求,包括插桩的方法和值.插桩的时机.插桩追踪记录方式等. Instrument来通过代理的方式访问JVM,实现 ...
- 【转】前端工程筹建NodeJs+gulp+bower
转自:http://www.myexception.cn/javascript/1781968.html npm nodejs 安装过程中会自动安装npm,nodejs安装程序会在环境变量中添加两个变 ...
- MongoDB-C#驱动基本操作
#region IMongoQuery //Query.EQ("", val);//字段值=val //Query.NE("", val);//字段值!=val ...
- Java_动态重新加载Class总结
在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...
- css变形 transform【转】
transition:过度属性 transition-property 规定设置过度效果的css属性的名称,默认可以写all transition-duration 规定完成过度效果需要多少秒或毫秒 ...
- ZeroMQ接口函数之 :zmq_msg_data - 返回消息内容的指针
ZeroMQ 官方地址 :http://api.zeromq.org/4-1:zmq_msg_data zmq_msg_data(3) ØMQ Manual - ØMQ/3.2.5 Name zmq ...
- EaseMode
The following graphs demonstrate the different values of EasingMode, where f(t) represents the anima ...
- Java图片转换为base64格式
/** * @Descriptionmap 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * @author temdy * @Date 2015-01-26 * @param pa ...