1. 程式人生 > >crm 動態一級二級菜單

crm 動態一級二級菜單

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 動態一級二級菜單