面包屑

制定面包屑

如果用到权限校验,要把面包屑的逻辑,构建面包屑列表,写在中间件中

import re
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import HttpResponse,redirect
from rbac.models import Permission

class PermissionMiddleWare(MiddlewareMixin):

    def process_request(self,request):
        print("permission_list",request.session.get("permission_list"))
        current_path = request.path

        # 设置白名单放行
        for reg in  ["/login/","/admin/*", "/rbac/permissions_tree/"]:
            ret=re.search(reg,current_path)
            if ret:
                return None
        # /customers/edit/1

        # 校验是否登录

        user_id=request.session.get("user_id")
        if not user_id:
            return redirect("/login/")

        # 校验权限
        permission_list=request.session.get("permission_list")

        # 路径导航列表
        request.breadcrumb = [
            {
                "title": "首页",
                "url":"/"
            }
        ]

        for item in permission_list:
             reg="^%s$"%item["url"]
             ret=re.search(reg,current_path)
             if ret:
                 show_id = item["pid"] or item["id"]
                 request.show_id = show_id

                 # 确定面包屑列表
                 if item["pid"]:
                     ppermission = Permission.objects.filter(pk = item["pid"]).first()
                     request.breadcrumb.extend([
                         {
                             "url":ppermission.url,
                             "title":ppermission.title,
                         },  # 父权限字典
                         {
                             "title": item["title"],
                             "url": request.path,
                         },  # 子权限字典
                     ])
                 else:
                     request.breadcrumb.append(
                         {
                             "title": item["title"],
                             "url": item["url"],
                         }
                     )

                 return None
        print(request.breadcrumb_list)
        return HttpResponse("无访问权限!")

(1)如果不自定义标签

request.breadcrumb  是全局的,直接可以在模板文件中使用,在此次实例中,将面包屑的的位置放在继承的模版中(lay.html)
{#                    {% for item in request.breadcrumb %}#}
{##}
{# <li><a href="{{ item.url }}">{{ item.title }}</a></li>#}
{# {% endfor %}#}


(2)  如果自定义标签

templatetags文件夹
rbac.py文件
#######
@register.inclusion_tag('rbac/breadcrumb.html')
def breadcrumb(request):
return {'breadcrumb_list': request.breadcrumb}
 
bredcrumb.html文件中
<ol class="breadcrumb no-radius no-margin" style="border-bottom: 1px solid #ddd;">

{% for li in breadcrumb_list %}
{% if forloop.last %}
<li>{{ li.title }}</li>
{% else %}
<li><a href="{{ li.url }}">{{ li.title }}</a></li>
{% endif %}

{% endfor %}

</ol>


lay.html文件中
{% load rbac %}
{% breadcrumb request %}

 最终的效果

 

posted @ 2018-11-23 21:46  团子emma  阅读(160)  评论(0)    收藏  举报