二级菜单

 1 from django.db import models
 2 
 3 # Create your models here.
 4 class User(models.Model):
 5     name=models.CharField(max_length=11)
 6     pwd=models.CharField(max_length=11)
 7     roles=models.ManyToManyField('Role')
 8     def __str__(self):
 9         return self.name
10 
11 class Role(models.Model):
12     title=models.CharField(max_length=11)
13     permissions=models.ManyToManyField('Permission')
14     def __str__(self):
15         return self.title
16 
17 class Menu(models.Model):
18     title=models.CharField(max_length=32,verbose_name="菜单")
19     icon=models.CharField(max_length=32,verbose_name="图标",null=True,blank=True)
20 
21 class Permission(models.Model):
22     title=models.CharField(max_length=32)
23     url=models.CharField(max_length=32)
24     menu=models.ForeignKey('Menu',on_delete=models.CASCADE,null=True)
25     # icon=models.CharField(max_length=32,default="")
26     def __str__(self):
27         return self.title
表结构
 1 from app01.models import Role
 2 
 3 def initial_session(user,request):
 4     permissions = Role.objects.filter(user=user).values('permissions__url',
 5                                                         'permissions__title',
 6                                                         'permissions__menu__title',
 7                                                         'permissions__menu__icon',
 8                                                         'permissions__menu__pk',
 9                                                         ).distinct()
10     permission_list = []
11     permission_menu_dict = {}
12     for item in permissions:
13         permission_list.append(item['permissions__url'])
14         menu_pk = item['permissions__menu__pk']
15         if menu_pk:
16             if menu_pk not in permission_menu_dict:
17                 permission_menu_dict[menu_pk] = {
18                     "menu_title": item['permissions__menu__title'],
19                     "menu_icon": item['permissions__menu__icon'],
20                     "children": [
21                         {
22                             "title": item['permissions__title'],
23                             "url": item['permissions__url'],
24                         }
25                     ],
26                 }
27             else:
28                 permission_menu_dict[menu_pk]["children"].append({
29                     "title": item['permissions__title'],
30                     "url": item['permissions__url'],
31                 })
32     print(permission_menu_dict)
33     request.session['permission_list'] = permission_list
34     request.session['permission_menu_dict'] = permission_menu_dict
rbac.py
 1 import re
 2 
 3 from django.template import Library
 4 
 5 register=Library()
 6 @register.inclusion_tag("rbac/menu.html")
 7 def get_menu_style(request):
 8     permission_menu_dict = request.session.get('permission_menu_dict')
 9     for val in permission_menu_dict.values():
10         for item in val["children"]:
11             val["class"] = "active"
12             ret = re.search("^{}$".format(item['url']), request.path)
13             if ret:
14                 val["class"] = ""
15     return {'permission_menu_dict':permission_menu_dict}
templatetags/rbac.py
<div class="multi-menu">
    {% for foo in permission_menu_dict.values %}
        <div class="item">
        <div class="title"><i class="{{ foo.menu_icon }}"></i>{{ foo.menu_title }}</div>
        <div class="body {{ foo.class }}">
            {% for item in foo.children %}
                <a href="{{ item.url }}">{{ item.title }}</a>
            {% endfor %}

        </div>
        </div>
    {% endfor %}
</div>
menu.html
from django.contrib import admin
from app01 import models
# Register your models here.
admin.site.register(models.User)

class RoleConfig(admin.ModelAdmin):
    list_display = ['title']

admin.site.register(models.Role,RoleConfig)

class PermissionConfig(admin.ModelAdmin):
    list_display = ['pk','title','url','menu']
    # list_editable = ['title','is_menu']
    search_fields = ['title']
    ordering = ['pk']

admin.site.register(models.Permission,PermissionConfig)
原文地址:https://www.cnblogs.com/xuqidong/p/12548777.html