一.
  model
  

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class MenuInfo(models.Model):
  5. parent = models.ForeignKey('MenuInfo', blank=True, null=True)
  6. name = models.CharField('菜单名称', max_length=15)
  7. menu_icon = models.ForeignKey('IconInfo', verbose_name='图标')
  8. url = models.CharField('网址', max_length=100, blank=True, null=True)
  9. show = models.BooleanField('是否显示', default=False)
  10. priority = models.IntegerField(verbose_name=u'显示优先级', null=True, blank=True, default=-1)
  11.  
  12. class Meta:
  13. db_table = 'MenuInfo'
  14.  
  15. class IconInfo(models.Model):
  16. DisplayName = models.CharField(max_length=100)
  17. ClassName = models.CharField(max_length=100)
  18. SourceType = models.CharField(max_length=100)
  19. CreateTime = models.DateTimeField(auto_created=True)
  20.  
  21. class Meta:
  22. db_table = 'IconInfo'

model的代码

二.

  模板中间件

  1.setting的设置

  1. TEMPLATES = [
  2. {
  3. 'BACKEND': 'django.template.backends.django.DjangoTemplates',
  4. 'DIRS': [os.path.join(BASE_DIR, 'templates')]
  5. ,
  6. 'APP_DIRS': True,
  7. 'OPTIONS': {
  8. 'context_processors': [
  9. 'django.template.context_processors.debug',
  10. 'django.template.context_processors.request',
  11. 'django.contrib.auth.context_processors.auth',
  12. 'django.contrib.messages.context_processors.messages',
  13. 'adminLTE.context_processors.make_menus_processor',
  14. ],
  15. 'builtins': [ # Add this section
  16. "debugtools.templatetags.debugtools_tags", # Add this line
  17. ],
  18. },
  19. },
  20. ]

setting的设置

  2.中间件的代码
  2.1设置了一个全局变量,这样方便设置菜单的active的选中状态

  1. from django.utils.html import format_html
  2. from menuInfo.models import MenuInfo
  3.  
  4. menu_active = ''
  5.  
  6. def make_menus_html(menus, parent_id=None, current_parent_id=None, active=None):
  7. """
  8. menus = Menus.objects.all()
  9. :param menus: 寻找的对象,传一个queryset对象
  10. :param parent_id: 父级菜单ID
  11. :param current_parent_id: 当前父级菜单ID
  12. :param active: 激活的菜单名
  13. :return:
  14. """
  15. make_html = ""
  16. for menu in menus:
  17. child_menu_flag = "treeview"
  18. menu_right_flag = '<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i></span>'
  19. child_menu = '<li class="{active}"><a href="{menu_url}"><i class="fa fa-circle-o"></i> {menu_name}</a></li>'
  20. child_menu_html = '<ul class="treeview-menu">{make_child_menu_html}</ul>'
  21. master_menu_html = """
  22. <li class="{child_menu_flag} {active}">
  23. <a href="{menu_url}"><i class="fa {menu_icon}"></i> <span>{menu_name}</span>{menu_right_flag}</a>
  24. <ul class="treeview-menu">
  25. {children_menu_html}
  26. </ul>
  27. </li>"""
  28. children_menu_html = """
  29. <li class="treeview">
  30. <a href="{menu_url}"><i class="fa fa-circle-o"></i> <span>{menu_name}</span>{menu_right_flag}</a>
  31. {child_menu_html}
  32. </li>"""
  33. parent = menu.parent # 获取当前菜单的父级菜单
  34. if current_parent_id == menu.id or (not parent and current_parent_id):
  35. continue # 如果当前父级菜单ID是自己或没有父级菜单且有当前父级ID则跳过本次循环
  36. if not parent and current_parent_id is None: # 如果没有父级菜单且当前父级ID是None
  37. make_children_menu_html = make_menus_html(menus, parent_id=parent_id, current_parent_id=menu.id)
  38. if not make_children_menu_html:
  39. menu_right_flag = ''
  40. menu_icon = menu.menu_icon.ClassName
  41. if hasattr(menu, 'icon_name'):
  42. menu_icon = menu.icon_name
  43. active = menu_active.split('/')[1]
  44. active = '/%s/' % active
  45. if menu.url == active:
  46. active_menu = 'active'
  47. else:
  48. active_menu = ''
  49. make_master_menu_html = master_menu_html.format(child_menu_flag=child_menu_flag,
  50. active=active_menu,
  51. menu_url=menu.url,
  52. menu_icon=menu_icon,
  53. menu_name=menu.name,
  54. menu_right_flag=menu_right_flag,
  55. children_menu_html=make_children_menu_html)
  56. make_html += make_master_menu_html
  57. elif parent and current_parent_id == parent.id: # 如果有父级且当前父级ID是自己的父级ID4
  58. make_child_menu_html = make_menus_html(menus, parent_id=current_parent_id, current_parent_id=menu.id)
  59. if make_child_menu_html:
  60. child_menu_html = child_menu_html.format(make_child_menu_html=make_child_menu_html)
  61. children_menu_html = children_menu_html.format(menu_url=menu.url,
  62. menu_name=menu.name,
  63. menu_right_flag=menu_right_flag,
  64. child_menu_html=child_menu_html)
  65. else:
  66. if menu.url == menu_active:
  67. active_menu = 'active'
  68. else:
  69. active_menu = ''
  70. children_menu_html = child_menu.format(menu_url=menu.url, menu_name=menu.name, active=active_menu)
  71. make_html += children_menu_html
  72. else:
  73. continue
  74. return make_html
  75.  
  76. def make_menus_processor(request):
  77. menus_obj = MenuInfo.objects.filter(show=0)
  78. global menu_active
  79. menu_active = request.path
  80. menus = make_menus_html(menus=menus_obj, active=menu_active)
  81. return {'menus': format_html(menus)}

模板中间件代码

adminLTE的自动化菜单的更多相关文章

  1. 用C#从数据库动态生成AdminLTE菜单的一种方法

    当前的应用设计风格趋于Flat扁平化,很多基于BootStrap实现了很多UI非常漂亮的管理界面(Bootstrap admin template). 此核心文件开源在Github:https://g ...

  2. yii2 rbac权限控制之菜单menu详细教程

    作者:白狼 出处:http://www.manks.top/article/yii2_rbac_menu本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则 ...

  3. yii2权限控制rbac之菜单menu最详细教程

    前面我们在博文 yii2搭建完美后台并实现rbac权限控制实例教程中完美实现了yii2的后台搭建和rbac权限控制,如果你还没有实现,请先看上文再回来参考本文,因为本文是在上文的基础上进行完善和补充. ...

  4. teprunner测试平台用例前置模块开发

    本文开发内容 现在正式进入测试相关功能开发.teprunner测试平台底层是pytest,中间层是tep,还没了解的朋友可以先看看tep的文章,整个平台的设计思路和后面用例的执行都会基于这个工具.te ...

  5. SharePoint自动化系列——Site/Web/List级别的导航菜单

    转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ 需求:在不同的测试用例中,对脚本中不确定的因素需要和用户交互来确定,比如选择哪个site,选择哪个 ...

  6. ABP+AdminLTE+Bootstrap Table权限管理系统第十节--AdminLTE模板菜单处理

    上节我们把布局页,也有的临时的菜单,但是菜单不是应该动态加载的么?,所以我们这节来写菜单.首先我们看一下AdminLTE源码里面的菜单以及结构. <aside class="main- ...

  7. ABP+AdminLTE+Bootstrap Table权限管理系统第九节--AdminLTE引入及模板页和布局和菜单

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 AdminLTE AdminLTE 官网地址:https://adminlte.io/themes/AdminLT ...

  8. 修改AdminLTE左侧菜单展开延迟

    AdminLTE左侧菜单展开会有半秒钟的延迟. 看起来会慢半拍. 可修改 admin/dist/js/app.min.js中的 animationSpeed值(默认为500) 如下:

  9. adminlte+layui框架搭建2 - 动态菜单

    动态菜单 参考文章:https://cloud.tencent.com/developer/article/1342558 主要修改两个地方: 1.系统初始化加载一级菜单,在adminlte.js文件 ...

随机推荐

  1. C# 五、谈扩展方法的理解

    http://www.cnblogs.com/zhaopei/p/5678842.html

  2. 如何转换WMV到MP3,WMV到MP3播放器

    非常好的软件!!!!!没有注册,可以用.推荐给大家! http://www.daniusoft.com/cn/convert-wmv/wmv-to-mp3.html http://hi.baidu.c ...

  3. zorka源码解读之Instrument实现原理

    主要用到三方面技术: beanshell来实现可扩展:告诉zorkaAgent插桩的具体需求,包括插桩的方法和值.插桩的时机.插桩追踪记录方式等. Instrument来通过代理的方式访问JVM,实现 ...

  4. 【转】前端工程筹建NodeJs+gulp+bower

    转自:http://www.myexception.cn/javascript/1781968.html npm nodejs 安装过程中会自动安装npm,nodejs安装程序会在环境变量中添加两个变 ...

  5. MongoDB-C#驱动基本操作

    #region IMongoQuery //Query.EQ("", val);//字段值=val //Query.NE("", val);//字段值!=val ...

  6. Java_动态重新加载Class总结

    在此记载Java动态重新加载Class的点点滴滴,实现之前也在网上看了很多文章,但发现不是很清晰,后来发现总结,看源码实现还是最靠谱. 直接上代码: package com.lkb.autoCode. ...

  7. css变形 transform【转】

    transition:过度属性 transition-property 规定设置过度效果的css属性的名称,默认可以写all transition-duration 规定完成过度效果需要多少秒或毫秒 ...

  8. 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 ...

  9. EaseMode

    The following graphs demonstrate the different values of EasingMode, where f(t) represents the anima ...

  10. Java图片转换为base64格式

    /** * @Descriptionmap 将图片文件转化为字节数组字符串,并对其进行Base64编码处理 * @author temdy * @Date 2015-01-26 * @param pa ...