问题:
在用户登录后,如何只显示出用户权限的菜单呢?
需要设置显示菜单权限
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
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 %}
{% 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中:
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}
1class="static-menu"> 2 3 {% for item in permission_menu_list %} 4 "{{ item.url }}" class="{{ item.class }}"> 5 class="icon-wrap">class="fa {{ item.icon }}"> {{ item.title }} 6 7 {% endfor %} 8 9
1class="menu-body"> 2 3 {% load web %} 4 {% get_menu_styles request %} 5 6
其他过滤器
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("%s"%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}
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 没有限制{%%}