django 權限設置-菜單顯示


問題:
在用戶登錄后,如何只顯示出用戶權限的菜單呢?
需要設置顯示菜單權限

1.為了顯示菜單,需要在models權限上添加is_menu(手動判斷是否是查看)的icon(圖標字符串)

在rbac中錄入另一個的權限,判斷是否顯示菜單的,若是沒有,返回一個空列表[],有則添加session中permission_menu_list=[{},{}]

 1 from rbac.models import Role
 2 
 3 
 4 def initial_sesson(user,request):
 5     """
 6     功能:將當前登錄人的所有權限錄入session中
 7     :param user: 當前登錄人
 8     """
 9     # 查詢當前登錄人的所有權限列表
10     # 查看當前登錄人的所有角色
11     # ret=Role.objects.filter(user=user)
12     permissions = Role.objects.filter(user=user).values("permissions__url",
13                                                         "permissions__is_menu",
14                                                         "permissions__title",
15                                                         "permissions__icon",
16                                                         ).distinct()
17     print(permissions)
18 
19     permission_list = []
20     permission_menu_list = []
21 
22     for item in permissions:
23         # 構建權限列表
24         permission_list.append(item["permissions__url"])
25 
26         # 構建菜單權限列表
27         if item["permissions__is_menu"]:
28             permission_menu_list.append({
29                 "title":item["permissions__title"],
30                 "icon":item["permissions__icon"],
31                 "url":item["permissions__url"],
32             })
33 
34     # 將當前登錄人的權限列表注入session中
35     request.session["permission_list"] = permission_list
36     # 將當前登錄人的菜單權限列表注入session中
37     print("permission_menu_list",permission_menu_list)
38     request.session["permission_menu_list"] = permission_menu_list
rbac

2.在登錄成功后,在菜單區域(side_bar):渲染出菜單鏈接標簽:

def get_menu_styles(request):
permission_menu_list = request.session.get("permission_menu_list")
for item in permission_menu_list:
if re.search("^{}$".format(item["url"]), request.path):
item["class"] = "active"

return {"permission_menu_list":permission_menu_list}

 

{% for item in request.session.permission_menu_list %}
               <p><a href="{{ item.url }}">{{ item.title }}</a></p>
         {% endfor %}

3.點擊標簽加入active樣式:

 解決思路1:
            每一個返回母版的視圖函數中:
                permission_menu_list = request.session.get("permission_menu_list")
                for item in permission_menu_list:
                    if re.search("^{}$".format(item["url"]), request.path):
                        item["class"] = "active"
            
        解決思路2:    引入inclusion_tag方法:
                @register.inclusion_tag("rbac/menu.html")
                def get_menu_styles(request):
                    permission_menu_list = request.session.get("permission_menu_list")
                    for item in permission_menu_list:
                        if re.search("^{}$".format(item["url"]), request.path):
                            item["class"] = "active"

                    return {"permission_menu_list":permission_menu_list}
            
            
            在layout.html中:
                     <div class="menu-body">
            
                           {% load web %}
                           {% get_menu_styles request %}

                    </div>

 

 

4.這里用到自定義標簽

自定義過濾器和標簽




1 在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.

2 在app中創建templatetags模塊(模塊名只能是templatetags)

3 創建任意 .py 文件,如:my_tags.py
        

            from django import template
            from django.utils.safestring import mark_safe
            register = template.Library()   #register的名字是固定的,不可改變
            
            @register.filter
            def filter_multi(v1,v2):
                return  v1 * v2

4  在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py
        {% load my_tags %} 

5 使用
    在模板中:
    
    # num=12
    {% load my_tags %} 
    {{ num|filter_multi:2 }} #24

 

新建的trmplatewares里 的rbac 標簽過濾器

 1 from django.template import Library
 2 import re
 3 register =Library()
 4 
 5 
 6 @register.inclusion_tag("rbac/menu.html")
 7 def get_menu_styles(request):
 8     permission_menu_list = request.session.get("permission_menu_list")
 9     for item in permission_menu_list:
10         if re.search("^{}$".format(item["url"]), request.path):
11             item["class"] = "active"
12 
13     return {"permission_menu_list":permission_menu_list}
rbac
1 <div class="static-menu">
2 
3         {% for item in permission_menu_list %}
4             <a href="{{ item.url }}" class="{{ item.class }}">
5                 <span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.title }}
6             </a>
7         {% endfor %}
8 
9 </div>
menu
1         <div class="menu-body">
2 
3                {% load web %}
4                {% get_menu_styles request %}
5 
6         </div>
引用

其他過濾器

 1 from django.utils.safestring import mark_safe
 2 
 3 from django.template import Library
 4 register =Library()
 5 
 6 
 7 @register.filter
 8 def mul(x,y):
 9     return x*y
10 
11 @register.filter
12 def tag(val):
13 
14     return mark_safe("<a>%s</a>"%val)
15 
16 @register.filter
17 def lower(val):
18 
19     return val.lower()
20 
21 @register.simple_tag
22 def mul_tag(x,y,z):
23     return x*y*z
24 
25 
26 
27 @register.inclusion_tag("web/menu.html")
28 def get_menu_style():
29     menu_list=[123,666,999]
30     return {"menu_list":menu_list}
cal
1     {% load web %}
2     {{ n|mul:12 }}
3     {{ val|lower }}
4 
5     {{ "點我"|tag }}
6     {% mul_tag 2 3 4 %}
7     {% get_menu_style %}
頁面上渲染

都是通過強大的render顯示的

上邊的菜單用到@register.inclusion_tag("menu.html")直接返回的頁面{%%}

 

@register.filter 最大兩個變量{{  |   }}
@register.simple_tag  沒有限制{%%}

 



 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM