crm 動態一級二級菜單
阿新 • • 發佈:2019-03-21
lis distinct 9.png 字典 .class 寫入 dev eight src
之前代碼菜單是寫是的
如何 讓他 動態 生成了 首先 添加 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‘]})
crm 動態一級二級菜單