adminLTE的自动化菜单
一.
model
1 from django.db import models 2 3 4 # Create your models here. 5 class MenuInfo(models.Model): 6 parent = models.ForeignKey('MenuInfo', blank=True, null=True) 7 name = models.CharField('菜单名称', max_length=15) 8 menu_icon = models.ForeignKey('IconInfo', verbose_name='图标') 9 url = models.CharField('网址', max_length=100, blank=True, null=True) 10 show = models.BooleanField('是否显示', default=False) 11 priority = models.IntegerField(verbose_name=u'显示优先级', null=True, blank=True, default=-1) 12 13 class Meta: 14 db_table = 'MenuInfo' 15 16 17 class IconInfo(models.Model): 18 DisplayName = models.CharField(max_length=100) 19 ClassName = models.CharField(max_length=100) 20 SourceType = models.CharField(max_length=100) 21 CreateTime = models.DateTimeField(auto_created=True) 22 23 class Meta: 24 db_table = 'IconInfo'
二.
模板中间件
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 ]
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 77 def make_menus_processor(request): 78 menus_obj = MenuInfo.objects.filter(show=0) 79 global menu_active 80 menu_active = request.path 81 menus = make_menus_html(menus=menus_obj, active=menu_active) 82 return {'menus': format_html(menus)}