之前代码菜单是写是的
如何 让他 动态 生成了 首先 添加 2个字段
admin.py 更改 显示
from django.contrib import admin from rbac import models # Register your models here. class PermissionAdmin(admin.ModelAdmin): list_display = [‘url‘, ‘title‘,‘is_menu‘,‘icon‘]#列表显示 list_editable = [‘title‘,‘is_menu‘,‘icon‘]#可编辑 admin.site.register(models.Permission, PermissionAdmin) admin.site.register(models.Role) admin.site.register(models.User)
然后进入 admin 把设为 一级菜单的 图标设置上去
auth.py 进行 mode筛选
def login(request): if request.method == ‘POST‘: # 获取用户名和密码 user = request.POST.get(‘user‘) pwd = request.POST.get(‘pwd‘) # 去数剧库进行筛选 obj = models.User.objects.filter(name=user, pwd=pwd).first() if not obj: return render(request, ‘login.html‘) permission_query = obj.roles.filter(permissions__url__isnull=False).values(‘permissions__url‘, ‘permissions__title‘,‘permissions__is_menu‘,‘permissions__icon‘).distinct() #通过查询到的用户的obj反查角色表,values 正向查询当前用户的权限表的url信息 title permission_list=[]#存放权限信息 menu_list=[]#存放菜单信息 for item in permission_query: permission_list.append({‘url‘:item[‘permissions__url‘]}) if item.get(‘permissions__is_menu‘): menu_list.append({‘url‘:item[‘permissions__url‘],‘icon‘:item[‘permissions__icon‘],‘title‘:item[‘permissions__title‘]}) # print(‘1111‘,permission_query) # <QuerySet [{‘permissions__url‘: ‘/index/‘, ‘permissions__title‘: ‘首页‘}]> #将权限信息写入到session request.session[settings.PERMISSION_SESSION_KEY]=permission_list #将菜单 信息 写入session request.session[settings.MENU_SESSION_KEY]=menu_list request.session[‘is_login‘] = True return redirect(reverse(‘index‘)) return render(request, ‘login.html‘)
settings.py中定义
# 白名单 WHITE_LIST = [ r‘^/login/$‘, r‘^/reg/$‘, r‘^/admin/.*‘, ] # 免认证的地址 需要登录 不行权限校验 NO_PERMISSION_LIST = [ ‘/index/‘ ] #权限信息url key PERMISSION_SESSION_KEY=‘permissions‘ #存放菜单信息 MENU_SESSION_KEY=‘menus‘
更改一下 rbacapp中 更改 中间件中 middlewares/rbac.py 相应的值
# 获取当前用户的权限 permission_list = request.session[settings.PERMISSION_SESSION_KEY] print(permission_list) # 权限的校验 for i in permission_list: if re.match(‘^{}$‘.format(i[‘url‘]), url): return # 没匹配成功 没有权限 return HttpResponse(‘没有访问的权限‘)
layout.html中 跟改显示 这样虽然成功了 但是还是写死了menus
<div class="static-menu"> {# <a href="/customer/list/" class="active">#} {# <span class="icon-wrap"><i class="fa fa-connectdevelop"></i></span> 客户管理</a>#} {# <a href="/payment/list/">#} {# <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> 账单管理</a>#} {% for item in request.session.menus %} <a href="{{ item.url }}"> <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> {{ item.title }}</a> {% endfor %} </div>
如何解决?
自定义 inclusion_tag
创建 templatetags目录 rbac.py
from django import template from django.conf import settings register=template.Library() import re @register.inclusion_tag(‘menu.html‘) def menu(request): menu_list=request.session.get(settings.MENU_SESSION_KEY) for item in menu_list: url=item[‘url‘] if re.match(‘^{}$‘.format(url),request.path_info): item[‘class‘]=‘active‘ return {‘menu_list‘:menu_list}
menu.html
<div class="static-menu"> {% for item in menu_list%} <a href="{{ item.url }}" class="{{ item.class }}"> <span class="icon-wrap"><i class="fa fa-code-fork"></i></span> {{ item.title }}</a> {% endfor %} </div>
为了 下次 直接调用rbac 整合
把之前的判断 web views中的auth.py中的 查询写入session部分 移动到rbac/server/init_permission.py
把 web下的 templatetags 移动到rbac app下
把menu.html 移动到新建templates/rbac/中
把 css部分 移动到 static/css/menu.css
二级菜单调用自动生成
更改modes中的表字段 添加 menu表
进入 admin 进行 权限 划分
更改 server permission.py
# 权限的列表 permission_list = [] # 菜单的字典 menu_dict ={} for i in permission_query: # 把权限的信息放入permission_list permission_list.append({‘url‘: i[‘permissions__url‘]}) menu_id = i.get(‘permissions__menu_id‘) if not menu_id: continue menu_dict.setdefault(menu_id, { ‘title‘: i[‘permissions__menu__title‘], ‘icon‘: i[‘permissions__menu__icon‘], ‘children‘: [ ] }) menu_dict[menu_id][‘children‘].append({‘title‘: i[‘permissions__title‘], ‘url‘: i[‘permissions__url‘]})
原文地址:https://www.cnblogs.com/zaizai1573/p/10569090.html
时间: 2024-10-18 20:43:43