我们之前权限中的list分类的东东,因为edit,delete,add这些都不适合放在menu,所以就放list下的东东。
list相关,那我们重新拿数据库中的字段信息了,menu中,至少需要url,title,这两个字段,然后是list分类下的。所以我们需要list,url,title这三个字段呢!
我们需要在permission_url.py末尾添加这几行代码:
版本1:
# 唯有list的url可以放在menu中,需要提取出list的url和permissiongroup__title
action_dict = role_obj.values('permissions__action', 'permissions__url', 'permissions__group__title').distinct()
print(action_dict)
action_list = []
for i in action_dict:
if i.get("permissions__action") == 'list':
action_list.append((i.get('permissions__url'), i.get('permissions__group__title')))
# 把提取出的url放入session中 [('/user/', '用户管理')]
request.session['action_list'] = action_list
然后在views.py:
def user(request):
user_obj = User.objects.all()
# 获取action
# action = request.action
per = Per(request)
action_list = request.session.get('action_list', [])
return render(request, 'user.html', {'user_obj': user_obj, 'per': per, 'action_list': action_list})
base.html:
<div class="menu">
{% for i in action_list %}
<p><a href="{{ i.0 }}">{{ i.1 }}</a></p>
{% endfor %}
</div>
然后就写好了,但是有个bug就是我们只在user下写了这,其他都没写,如果是在role下面这个会怎么样呢?
没错就是不显示了。这就导致数据传输有问题了。如果要role显示,就要在role下面也传输那样的数据,那样就繁琐了。这就有了版本二
版本二:
django有一个templatetags,templatetags里面有个inclusion_tag,就可以很好的解决这个问题了
inclusion_tag
首先需要在我们 rbac目录下创建一个名为:templatetags 的python文件夹名字一定要是这一个名字,因为这是Django规定的,创建完成后,我们再创建一个rbac/templatetags/menu_tags.py文件,
menu_tags.py
# -*- coding: utf-8 -*-
# @Time : 2020/1/6 上午 09:15
# @Author : lh
# @Email : [email protected]
# @File : menu_tags.py
# @Software: PyCharm
from django import template
# 一定要是register这个名字
register = template.Library()
@register.inclusion_tag('menu.html')
def menu(request):
action_list = request.session.get('action_list', [])
return {'action_list': action_list}
@register.inclusion_tag(‘menu.html’) 所以需要创建一个menu.html:
{% for i in action_list %}
<p><a href="{{ i.0 }}">{{ i.1 }}</a></p>
{% endfor %}
后面就是 inclusion_tag的使用了:
我们再base.html:
<div class="menu">
{% load menu_tags %}
{% menu request %}
</div>
request是传递进去的参数。