为后续给菜单设置权限管理方便,通过给页面模版菜单动态渲染,通过数据菜单表进行匹配需要渲染的菜单

 #Django表结构

 class Menus(models.Model):

     name = models.CharField(max_length=32, verbose_name=u'菜单名')
parent = models.ForeignKey('self',
verbose_name=u'父级菜单',
null=True,
blank=True,
default='',
help_text=u'如果添加的是子菜单,请选择父菜单')
show = models.BooleanField(verbose_name=u'是否显示',
default=False,
help_text=u'菜单是否显示,默认添加不显示')
url = models.CharField(max_length=300,
verbose_name=u'菜单url地址',
null=True,
blank=True,
default='javascript:void(0)',
help_text=u'是否给菜单设置一个url地址')
priority = models.IntegerField(verbose_name=u'显示优先级',
null=True,
blank=True,
default=-1,
help_text=u'菜单的显示顺序,优先级越大显示越靠前')
permission_id = models.IntegerField(verbose_name=u'权限编号',
help_text=u'给菜单设置一个编号,用于权限控制',
error_messages={'field-permission_id': u'只能输入数字'}) def __str__(self):
return "{parent}{name}".format(name=self.name, parent="%s-->" % self.parent.name if self.parent else '') class Meta:
verbose_name = u"菜单"
verbose_name_plural = u"菜单"
ordering = ["-priority", "id"]
 #admin.py

 from django.contrib import admin

 # Register your models here.

 from cloud.api import models as api_models

 class MenusAdmin(admin.ModelAdmin):
ordering = ('-parent',)
list_filter = ('name',)
list_display = ['name', 'parent', 'show', 'url', 'priority', 'permission_id']
fields = ['name', 'parent', 'show', 'url', 'priority', 'permission_id'] 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后台添加菜单数据,即可实现层叠动态可折叠菜单,该样式模版基于一个开源的管理模版

https://github.com/almasaeed2010/AdminLTE

Django动态渲染多层菜单的更多相关文章

  1. 动态渲染左侧菜单栏 :menu tree 动态渲染

    其中后端代码不包含权限控制,同时支持二级(无子菜单) 和 三级菜单(无子菜单). 1.layui前端代码:(其他前端框架实现方法通用,不过需要修改js中append对应标签元素即可) <div ...

  2. layui navTree 动态渲染菜单组件介绍

    navTree.js 简介 extends/navTree.js 是一个基于 layui 扩展的模块化组件,用于构建后台布局系统中的垂直导航菜单与水平导航菜单. extends/navTree.js ...

  3. 微信小程序-列表渲染多层嵌套循环

    微信小程序-列表渲染多层嵌套循环 入门教程之列表渲染多层嵌套循环,目前官方的文档里,主要是一维数组列表渲染的案例,还是比较简单单一,给刚入门的童鞋还是无从入手的感觉. <view wx:for= ...

  4. Vue + Element UI 实现权限管理系统 前端篇(十):动态加载菜单

    动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...

  5. Vue + Element UI 实现权限管理系统(动态加载菜单)

    动态加载菜单 之前我们的导航树都是写死在页面里的,而实际应用中是需要从后台服务器获取菜单数据之后动态生成的. 我们在这里就用上一篇准备好的数据格式Mock出模拟数据,然后动态生成我们的导航菜单. 接口 ...

  6. jquery 根据后台传递过来的三维数组动态生成三级菜单

    根据后台传递过来的三维数组动态生成三级菜单 <!DOCTYPE html> <html lang="en"> <head> <meta c ...

  7. vue 动态渲染数据很慢或不渲染

    vue 动态渲染数据很慢或不渲染 原因是因为vue检测速度很慢,因为多层循环了,在VUE 2.x的时候还能渲染出来,1.x的时候压根渲染不出来.解决方式:在动态改变数据的方法,第一行加上 this.$ ...

  8. django权限之二级菜单

    遗漏知识点 1.构建表结构时,谁被关联谁就是主表,在层级删除的时候,删除子表的时候,主表不会被删除,反之删除主表的话,字表也会被删除, 使用related_name=None   反向查询,起名用的 ...

  9. 渲染导航菜单的同时给每个菜单绑定不同的router跳转

    这个问题一开始的时候,我总想着router跳转只有两种方式 一种@click,一种router-link 然后我想着@click,绑定一个事件,事件下面无法确定我当前是哪个菜单,解决不了. 然后< ...

随机推荐

  1. mysql 日期查询 总结

    1,对一天24小时内每小时的数据量求和: SELECT IFNULL(SUM(CASE HOUR(时间字段) WHEN 0 THEN 1 ELSE 0 END),0)as '0', IFNULL(SU ...

  2. vuex 使用笔记

    1. 在store.js中 储存数据状态 02. 在action.js中分发行为 03. 在页面中获取并使用状态

  3. LINUX下YUM源配置

    转自:http://www.cnblogs.com/phoebus0501/archive/2010/12/14/1906144.html 1.确保RHEL5中已经安装了yum [root@lvs-m ...

  4. RecyclerView的使用之多种Item加载布局

    精益求精,为了更加透彻熟练得掌握,本文再次给大家介石介绍下如何利用RecyclerView实现多Item布局的加载,多Item布局的加载的意思就是在开发过程中List的每一项可能根据需求的不同会加载不 ...

  5. IE8 下 iframe 滚动条的问题

    //设置滚动条                $("iframe[name='updateFocalWork']").attr("scrolling", &qu ...

  6. sh4.case语句

    case ... esac 与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构.case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令.case语句格式如下: ...

  7. iOS推送小结(证书的生成、客户端的开发、服务端的开发)

    1.推送过程简介 1.1.App启动过程中,使用UIApplication::registerForRemoteNotificationTypes函数与苹果的APNS服务器通信,发出注册远程推送的申请 ...

  8. Linux文件权限和访问模式

    为了更加安全的存储文件,Linux为不同的文件赋予了不同的权限,每个文件都拥有下面三种权限: 所有者权限:文件所有者能够进行的操作 组权限:文件所属用户组能够进行的操作 外部权限(其他权限):其他用户 ...

  9. Lintcode 469. 等价二叉树

    ----------------------------------------------- AC代码: /** * Definition of TreeNode: * public class T ...

  10. **crontab的使用方式介绍和no crontab for root 提示的处理

    crontab的使用方式介绍   定时任务参数详解如下:  crontab -l     |  crontab -e    www.2cto.com   #*/30 * * * * ntpdate 1 ...