权限管理之左侧菜单管理
权限管理之左侧菜单管理
紧接着上次的文章,权限管理之权限粒度控制,我们已经实现了对权限的粒度管理,即在用户有操作权限的时候显示操作按钮。
我们将权限分组成用户管理和角色管理,现在的需求是在左侧菜单中显示出登录用户能够管理的权限。
例如,用户 A 有用户管理权限和角色管理权限,通过左侧菜单的按钮能够随意切换要操作的表,用户 B 只有用户管理权限,左侧菜单就只有一个对应的按钮。
左侧菜单注册
与之前操作管理类似,需要将我们需要的信息先注册到 session 中,该操作在用户登录时进行。
首先,分析一下需要存储到 session 中的信息有哪些。与权限粒度管理类似,判断该用户是否有操作权限肯定需要的有权限对应的 url 和 action ,为了显示按钮名字还需要权限组的名称。
其次,分析存储到 session 中的样式。通过判断是否有权限已经过滤掉了不符合的,只需以元组形式存入 url 和 权限组名称即可。
注册代码如下:
# 注册菜单权限
permissions = user.roles.all().values("permissions__url", "permissions__group__title", "permissions__action").distinct()
menu_permission_list = []
for item in permissions:
if item["permissions__action"] == "list":
menu_permission_list.append((item["permissions__url"], item["permissions__group__title"]))
request.session["menu_permission_list"] = menu_permission_list
模板层显示
将 menu_permission_list 注册到 session 中,通过视图函数赋值后就能在模板层中使用了。
<div class="menu">
<div>
{% for item in menu_permission_list %}
<p class="menu_btn"><a href="{{ item.0 }}">{{ item.1 }}</a></p>
{% endfor %}
</div>
</div>
引入自定义模板标签
现在已经实现了左侧菜单权限管理,可是存在一个不足,在每个展示表的视图函数中都需要对 menu_permission_list 赋值。我们通过自定义模板标签来解决这个问题。
关于模板标签的内容可参考:Django的模板与母版
在这,我们将赋值内容的代码封装到模板标签中:
# my_tags.py
from django import template
register = template.Library()
@register.inclusion_tag("menu.html")
def get_menu(request, ):
menu_permission_list = request.session["menu_permission_list"]
return {"menu_permission_list": menu_permission_list}
<!-- menu.html -->
<div>
{% for item in menu_permission_list %}
<p class="menu_btn"><a href="{{ item.0 }}">{{ item.1 }}</a></p>
{% endfor %}
</div>
而模板层的代码也相应改变:
{% load my_tags %}
<div class="menu">
{% get_menu request %}
</div>
GItHub 地址:https://github.com/protea-ban/oldboy/tree/master/9day84