权限管理之左侧菜单管理

权限管理之左侧菜单管理

紧接着上次的文章,权限管理之权限粒度控制,我们已经实现了对权限的粒度管理,即在用户有操作权限的时候显示操作按钮。

我们将权限分组成用户管理和角色管理,现在的需求是在左侧菜单中显示出登录用户能够管理的权限。
例如,用户 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>

1540611766789

1540611831281

GItHub 地址:https://github.com/protea-ban/oldboy/tree/master/9day84

posted @ 2018-11-01 17:13  banshaohuan  阅读(236)  评论(0编辑  收藏  举报