爲後續給菜單設置權限管理方便,經過給頁面模版菜單動態渲染,經過數據菜單表進行匹配須要渲染的菜單javascript
1 #Django表結構 2 3 class Menus(models.Model): 4 5 name = models.CharField(max_length=32, verbose_name=u'菜單名') 6 parent = models.ForeignKey('self', 7 verbose_name=u'父級菜單', 8 null=True, 9 blank=True, 10 default='0', 11 help_text=u'若是添加的是子菜單,請選擇父菜單') 12 show = models.BooleanField(verbose_name=u'是否顯示', 13 default=False, 14 help_text=u'菜單是否顯示,默認添加不顯示') 15 url = models.CharField(max_length=300, 16 verbose_name=u'菜單url地址', 17 null=True, 18 blank=True, 19 default='javascript:void(0)', 20 help_text=u'是否給菜單設置一個url地址') 21 priority = models.IntegerField(verbose_name=u'顯示優先級', 22 null=True, 23 blank=True, 24 default=-1, 25 help_text=u'菜單的顯示順序,優先級越大顯示越靠前') 26 permission_id = models.IntegerField(verbose_name=u'權限編號', 27 help_text=u'給菜單設置一個編號,用於權限控制', 28 error_messages={'field-permission_id': u'只能輸入數字'}) 29 30 def __str__(self): 31 return "{parent}{name}".format(name=self.name, parent="%s-->" % self.parent.name if self.parent else '') 32 33 class Meta: 34 verbose_name = u"菜單" 35 verbose_name_plural = u"菜單" 36 ordering = ["-priority", "id"]
1 #admin.py 2 3 from django.contrib import admin 4 5 # Register your models here. 6 7 from cloud.api import models as api_models 8 9 10 class MenusAdmin(admin.ModelAdmin): 11 ordering = ('-parent',) 12 list_filter = ('name',) 13 list_display = ['name', 'parent', 'show', 'url', 'priority', 'permission_id'] 14 fields = ['name', 'parent', 'show', 'url', 'priority', 'permission_id'] 15 16 admin.site.register(api_models.Menus, MenusAdmin)
# 模版中件件,用於在頁面返回且將菜單渲染出來 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><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 = "fa-eye" if hasattr(menu, 'icon_name'): menu_icon = menu.icon_name if menu.name == 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是本身的父級ID 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: children_menu_html = child_menu.format(menu_url=menu.url, menu_name=menu.name) make_html += children_menu_html else: continue return make_html def make_menus_processor(request): menus_obj = Menus.objects.all() menus = make_menus_html(menus=menus_obj, active="監控") return {'menus': format_html(menus)}
而後經過Django admin後臺添加菜單數據,便可實現層疊動態可摺疊菜單,該樣式模版基於一個開源的管理模版html