基于Django的RBAC组件(menu显示)进阶篇(四)

我们之前权限中的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是传递进去的参数。

发布了59 篇原创文章 · 获赞 18 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38091140/article/details/103822832