一. 一级菜单表
1. 首先要修改权限表的字段, 在权限表下面加上icon和 is_menu 的字段
2. 展示结果
# 我们既然想要动态生成一级菜单,那么就需要从数据库中拿出当前登录的用户的菜单表是哪个,那么我们就要在验证的部分拿出is_menu的字段,看是否为True,
然后把这些数据存到session中去,这里我们最好把request.session[key]中的可以写到settings中去,这样以后修改也方便些
其他的地方要用到session的时候也直接导入settings就行
3. 然后我们需要在html文件中进行操作了, 让不同用户显示不同菜单, 这时候我们就需要用到自定义标签inclusion_tag了, 这里我们要注意两点:
1. 一定要是引入包而不是文件夹, 就是带__init__的文件的templatetags
2. 一定不要在包下的py文件中进行循环, 在模板中进行循环
4. 让选中的标签显示active的状态
在自定义标签里面获取到request.path, 然后判断菜单的路径是否是获取到的路径(用正则), 如果是,在字典里面添加属性class='active', 然后在渲染的HTML文档里面取出来
二. rbac功能整合
按照流程整合,整合成一个组件, 就是把其他的项目也能用的东西整合到一起
1. 把验证部分的代码放到rbac/service/permission.py中, 然后封装成函数,需要使用的地方可以直接调用
2. 把需要的的css样式保存在rbac项目下的static/css中
1 def init_permission(request, obj): 2 # 跨表查询用双下划线 ORM获取到权限信息 过滤掉权限为空的 去重 3 permission_query = obj.roles.filter(permissions__url__isnull=False).values( 4 'permissions__url', 5 'permissions__menu__title', 6 'permissions__menu__icon', 7 'permissions__menu_id', 8 ).distinct() 9 10 11 # 菜单字典 # 二级菜单 12 menu_dict = {} 13 14 # 权限列表 15 permission_list = [] 16 for i in permission_query: 17 permission_list.append({'url': i['permissions__url']}) 18 19 menu_id = i.get('permissions__menu_id') 20 if not menu_id: 21 continue 22 23 menu_dict.setdefault(menu_id, { 24 'title': i['permissions__menu__title'], 25 'icon': i['permissions__menu__icon'], 26 'children': [] 27 }) 28 menu_dict[menu_id]['children'].append({'title': i['permissions__menu__title'], 'url': i['permissions__url']}) 29 30 # 这种可配置的东西写在settings中去 31 from django.conf import settings 32 request.session[settings.MENU_SESSION_KEY] = menu_dict 33 request.session[settings.PERMISSION_SESSION_KEY] = permission_list 34 request.session['is_login'] = True
三 . 二级菜单
1. 要新建一张表,作为一级菜单表, 然后把权限表外键到这个一级菜单表中去
2. 到admin中把新建的这张表注册一下,然后登陆admin,把权限表和一级菜单表的关系处理一下
3. 在验证登录成功后, 把需要用的东西放到session中去. 主要需要的是一级菜单的title, icon和二级菜单的title和url(上文中的init_permission函数中有获取方法)
4. 同样要用到自定义标签inclusion_tag
# menu_dict的数据是下面这样的: {1: {'title': '客户管理', 'icon': 'fa-user', 'children': [{'title': '客户展示', 'url': '/customer/list/'}]} # 拿value之后变成了: {'title': '客户管理', 'icon': 'fa-user', 'children': [{'title': '客户展示', 'url': '/customer/list/'}]
菜单点击事件