django權限二(多級菜單的設計以及展示)

多級權限菜單設計級標題欄

  我們現在只有數據展示,要進入其他url還需要手動的輸入路徑,非常的麻煩,所以我們要設計

一個導航欄以及側邊多級菜單欄,這個展示是通過stark組件的設計的增刪改查頁面,而 每一個

頁面我們都需要有導航欄和側邊的權限菜單欄,所以把這個公共的部分提起到一個網頁,讓增刪改

繼承這個頁面就可以了.

  base.html(這要是自己的樣式以及設計盒子讓其他網頁進行繼承)

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>CRM</title><link rel="shortcut icon" href="/static /imgs/luffy-study-logo.png"><link rel="stylesheet" href="/static/bootstrap/css/bootstrap.css"/><link rel="stylesheet" href="/static/font-awesome/css/font-awesome.css"/><link rel="stylesheet" href="/static/css/commons.css"/><link rel="stylesheet" href="/static/css/nav.css"/><script src="/static/js/jquery-3.3.1.min.js"></script><style>.pg-body > .left-menu {background-color: #F3F3F3;
            position: absolute;left: 1px;top: 60px;bottom: 0;width: 220px;overflow: auto;}.pg-body > .right-body {position: absolute;left: 225px;right: 0;top: 60px;bottom: 0;overflow: scroll;border-top: 0;font-size: 13px;min-width: 755px;padding: 20px;}.dropdown-menu {top: 118%;left: -108px;}a:hover{text-decoration: none!important;}</style>{% block css %}{% endblock %}</head>
<body><div class="pg-header"><div class="nav"><div class="logo-area left"><a href="#"><img class="logo" src="{% static 'imgs/logo.svg' %}"><span style="font-size: 18px;">CRM </span></a></div><div class="left-menu left"><a class="menu-item">資產管理</a><a class="menu-item">用戶信息</a><a class="menu-item">權限管理</a><div class="menu-item"><span>使用說明</span><i class="fa fa-caret-down" aria-hidden="true"></i><div class="more-info"><a href="#" class="more-item">666</a><a href="#" class="more-item">888</a></div></div></div><div class="right-menu right clearfix"><!-- Single button --><div class="btn-group user-info right"><img class="dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" width="50" height="50" class="img-circle" src="{% static 'imgs/default.jpg' %}"><ul class="dropdown-menu small"><li><a href="#" class="more-item">{{request.user.name}}個人信息</a></li><li><a href="/logout/" class="more-item">注銷</a></li><li><a href="/home/">修改密碼</a></li><li><a href="/home/">更換頭像</a></li></ul></div><a class="user-menu right"><i class="fa fa-user" aria-hidden="true"></i><span>{{ request.user }}</span></a><a class="user-menu right">消息<i class="fa fa-commenting-o" aria-hidden="true"></i><span class="badge bg-success">2</span></a><a class="user-menu right">通知<i class="fa fa-envelope-o" aria-hidden="true"></i><span class="badge bg-success">2</span></a><a class="user-menu right">任務<i class="fa fa-bell-o" aria-hidden="true"></i><span class="badge bg-danger">4</span></a></div></div>
</div><div class="pg-body">{# 左側欄  #}<div class="left-menu">{% block side_bar %}{#   自定義標簽 #}{% load rbac %}{% get_menu_list request %}{% endblock side_bar %}</div>{#  右側欄數據體 #}<div class="right-body">{% block content %}{% endblock content %}</div>
</div>{% block js %}{% endblock %}
</body>
</html>

?

  讓頁面繼承了相應的盒子之后,我么就會得到如下樣式

  

  那怎么把我們的多級菜單權限展現在右邊呢?

  這里需要要到一個新的語法(關于自定義模板標簽)

  建立如下文件夾

  

  rbac.py

from django import template
from ..models import Permission
register = template.Library()@register.inclusion_tag("rbac/menu.html")
def get_menu(request):print("OK...")permission_list = request.session.get("permission_list")  #獲取權限列表menu_list = []for per in permission_list:if per.get("type") == "menu": #如果是菜單列表加入列表,返回列表和menu.html渲染menu_list.append(per)return {"default_data": default_data}

  menu.html

  <div id="treeview" class="small"></div><script src="/static/bootstrap-treeview/js/bootstrap-treeview.js"></script>
<script type="text/javascript">// API文檔參數列表: https://www.cnblogs.com/tangzeqi/p/8021637.html$(function() {var options = {data:{{ default_data|safe }} , //data屬性是必須的,是一個對象數組    Array of Objects.color: "", //所有節點使用的默認前景色,這個顏色會被節點數據上的backColor屬性覆蓋.        StringbackColor: "#000000", //所有節點使用的默認背景色,這個顏色會被節點數據上的backColor屬性覆蓋.     StringborderColor: "#000000", //邊框顏色。如果不想要可見的邊框,則可以設置showBorder為false。        StringnodeIcon: "glyphicon glyphicon-stop", //所有節點的默認圖標checkedIcon: "glyphicon glyphicon-check", //節點被選中時顯示的圖標         StringcollapseIcon: "glyphicon glyphicon-minus", //節點被折疊時顯示的圖標        StringexpandIcon: "glyphicon glyphicon-plus", //節點展開時顯示的圖標        StringemptyIcon: "glyphicon", //當節點沒有子節點的時候顯示的圖標              StringenableLinks: false, //是否將節點文本呈現為超鏈接。前提是在每個節點基礎上,必須在數據結構中提供href值。        BooleanhighlightSearchResults: true, //是否高亮顯示被選中的節點        Booleanlevels: 2, //設置整棵樹的層級數  IntegermultiSelect: false, //是否可以同時選擇多個節點      BooleanonhoverColor: "#F5F5F5", //光標停在節點上激活的默認背景色      StringselectedIcon: "glyphicon glyphicon-stop", //節點被選中時顯示的圖標     StringsearchResultBackColor: "", //當節點被選中時的背景色searchResultColor: "", //當節點被選中時的前景色selectedBackColor: "", //當節點被選中時的背景色selectedColor: "#FFFFFF", //當節點被選中時的前景色showBorder: true, //是否在節點周圍顯示邊框showCheckbox: false, //是否在節點上顯示復選框showIcon: true, //是否顯示節點圖標showTags: false, //是否顯示每個節點右側的標記。前提是這個標記必須在每個節點基礎上提供數據結構中的值。uncheckedIcon: "glyphicon glyphicon-unchecked", //未選中的復選框時顯示的圖標,可以與showCheckbox一起使用};$('#treeview').treeview({color: "#4F4F4F",expandIcon: 'glyphicon glyphicon-chevron-right',collapseIcon: 'glyphicon glyphicon-chevron-down',nodeIcon: 'glyphicon glyphicon-bookmark',enableLinks: true,levels: 1,showIcon:false,selectedBackColor: "",selectedColor: "#333",data: {{ default_data|safe }},});$('#treeview').on('nodeSelected',function(event, data) {console.log(data);})});
</script>

  然后在base里面調用這個自定義標簽

  

        {# 左側欄  #}<div class="left-menu">{% block side_bar %}自定義標簽{% load rbac %}{% get_menu_list request %}{% endblock side_bar %}</div>

?

  整個流程:

?

那如何把數據動態的添加到側邊欄呢?我們需要修改代碼

 rbac.py

@register.inclusion_tag("rbac/menu.html")
def get_menu_list(request):permission_list = request.session.get('permission_list')permission_dic = {}for per_dic in permission_list:if per_dic['type'] == 'button':continue  # 過濾掉button權限,我們只要菜單權限new_per_dic = {}  # 對菜單權限的數據按照treeview的數據結構構建新的字典new_per_dic['text'] = per_dic['title']new_per_dic['href'] = per_dic['url']new_per_dic['nodes'] = []new_per_dic['parent_id'] = per_dic['parent_id']permission_dic[per_dic.get('id')] = new_per_dic  # 以自己的權限主鍵為鍵,以新構建的字典為值,構造新的字典print('========', permission_dic)permission_tree_list = []  # 整個數據大列表for per_id, per_dic in permission_dic.items():pid = per_dic.get('parent_id')  # 取每一個字典中的父idif not pid:  # 沒有父id(最高權限),就直接加入數據大列表
            permission_tree_list.append(per_dic)else:  # 有父id就加入父id隊對應的那個的node(一個列表)permission_dic[pid]['nodes'].append(per_dic)# 展開節點current_path = request.pathif current_path == per_dic.get('href'):pid = per_dic.get('parent_id')per_dic['emptyIcon']=''while pid:permission_dic[pid]['state'] = {'expanded': True}pid = permission_dic[pid]['parent_id']return {'permission_tree_list': json.dumps(permission_tree_list)} #前端不需要反序列化,bootstrap treeview會幫你做

  

我們會得到如下頁面:

  

轉載于:https://www.cnblogs.com/tjp40922/p/10311183.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387547.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6.17 dokcer(一)Compose 簡介

Compose 簡介 Compose 項目是 Docker 官方的開源項目&#xff0c;負責實現對 Docker 容器集群的快速編排。從功能上看&#xff0c;跟 OpenStack 中的 Heat 十分類似。 其代碼目前在 https://github.com/docker/compose 上開源。 Compose 定位是 「定義和運行多個 Docker 容器的…

【系統架構理論】一篇文章精通:Spring Cloud Netflix Eureka

是官方文檔的總結 http://spring.io/projects/spring-cloud-netflix#overview 講解基于2.0.2版本官方文檔 https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.0.2.RELEASE/single/spring-cloud-netflix.html Netflix提供了以下功能&#xff1a; 服務發現&am…

Flink DataStream 編程入門

流處理是 Flink 的核心&#xff0c;流處理的數據集用 DataStream 表示。數據流從可以從各種各樣的數據源中創建&#xff08;消息隊列、Socket 和 文件等&#xff09;&#xff0c;經過 DataStream 的各種 transform 操作&#xff0c;最終輸出文件或者標準輸出。這個過程跟之前文…

騰訊手游如何提早揭露游戲外掛風險?

目前騰訊SR手游安全測試限期開放免費專家預約&#xff01;點擊鏈接&#xff1a;手游安全測試立即預約&#xff01; 作者&#xff1a;sheldon&#xff0c;騰訊高級安全工程師 商業轉載請聯系騰訊WeTest獲得授權&#xff0c;非商業轉載請注明出處。 文中動圖無法顯示&#xff0c…

基于ARM Cortex-M0+ 的Bootloader 參考

源&#xff1a; 基于ARM Cortex-M0內核的bootloader程序升級原理及代碼解析轉載于:https://www.cnblogs.com/LittleTiger/p/10312784.html

小猿圈web前端之網站性能優化方案

現在前端不僅要能做出一個網站頁面&#xff0c;還要把這個頁面做的炫酷&#xff0c;那需要很大程度的優化&#xff0c;那么怎么優化才更好呢&#xff1f;小猿圈總結了一下自己優化的方案&#xff0c;感興趣的朋友可以看一下。一般網站優化都是優化后臺&#xff0c;如接口的響應…

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高,并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎,只是后來慢慢不維護了,目前是G

下面介紹一個開源的OCR引擎Tesseract2。值得慶幸的是雖然是開源的但是它的識別率較高&#xff0c;并不比其他引擎差勁。網上介紹Tessnet2也是當時時間排名第三的識別引擎&#xff0c;只是后來慢慢不維護了&#xff0c;目前是Google在維護&#xff0c;大家都知道Google 在搞電子…

js 更改json的 key

let t data.map(item > {return{fee: item[費用],companyName1: item.companyName,remark1: item.remark,beginTime1: item.beginTime,endTime1: item.endTime}})console.log(t) 源地址&#xff1a;https://www.cnblogs.com/Marydon20170307/p/8676611.html轉載于:https:/…

1.4版本上線(第八次會議)

在小組成員連夜趕工的奮斗下&#xff0c;終于在昨天深夜成功實現了UI界面功能 至此&#xff0c;我們的系統終于真正可實用而不是局限在命令行進行互動了 由于python嵌入數據庫功能實現難度較大&#xff0c;迫于時間的局限性&#xff0c;我們選擇了用json文件與txt文件進行替代&…

分UV教程

第一步 首先&#xff0c;打開一個練習場景“空中預警機1.max”&#xff08;這事小弟平時的練習做的不好獻丑了&#xff09;。&#xff08;圖01&#xff09; 圖01 第二步 這里我們拿機翼來舉例子&#xff0c;隱藏除機翼意外的其他模型。&#xff08;圖02&#xff09; 圖02 第三步…

k8s系列--- dashboard認證及分級授權

http://blog.itpub.net/28916011/viewspace-2215214/ 因版本不一樣&#xff0c;略有改動 Dashboard官方地址&#xff1a; https://github.com/kubernetes/dashboard dashbord是作為一個pod來運行&#xff0c;需要serviceaccount賬號來登錄。 先給dashboad創建一個專用的認證信息…

JAVA項目開發

16年java軟件開發經驗&#xff0c;全職項目開發&#xff0c;項目可簽合同、開普票和專票。 主要承接項目&#xff1a; 1、網站開發項目 自主開發千帆CMS動態發布系統&#xff0c;基于java/springboot2/jpa/easyui開發&#xff0c;簡單易用&#xff0c;后臺與前端分離&#xff0…

3dmax基本操作

1、基本操作平移視圖&#xff08;你所說的移動&#xff09;&#xff1a;CTRLP&#xff0c;或者用&#xff0c;滾輪。按住鼠標滾輪不放拖動&#xff0c;就行了。旋轉&#xff1a; ALT滾輪。按住ALT鍵不放&#xff0c;利用滾輪的移動&#xff08;滾輪也要按著不放&#xff09…

padding影響整個div的實際寬度

padding影響整個div的實際寬度 1.不讓padding影響整個div的實際寬度 所以要設置css屬性&#xff1a; box-sizing:box-sizingposted on 2019-01-25 16:58 玉貔貅 閱讀(...) 評論(...) 編輯 收藏 轉載于:https://www.cnblogs.com/yupixiu/p/10320564.html

unity3d 任務頭上的血條

人物的名稱與血條的繪制方法很簡單&#xff0c;但是我們需要解決的問題是如何在3D世界中尋找合適的坐標。因為3D世界中的人物是會移動的&#xff0c;它是在3D世界中移動&#xff0c;并不是在2D平面中移動&#xff0c;但是我們需要將3D的人物坐標換算成2D平面中的坐標&#xff0…

如何在C#中使用Win32和其他庫之三

具有內嵌字符數組的結構 某些函數接受具有內嵌字符數組的結構。例如&#xff0c;GetTimeZoneInformation() 函數接受指向以下結構的指針&#xff1a; typedef struct _TIME_ZONE_INFORMATION { LONG Bias; WCHAR StandardName[ 32 ]; SYSTEMTIME Standa…

unity3d 預制體

首先要說明一下什么是預制體&#xff1f; 在Unity3D里面我們叫它Prefab&#xff1b;我們也可以這樣理解&#xff1a;當制作好了游戲組件&#xff08;場景中的任意一個gameobject &#xff09;,我們希望將它制作成一個組件模版&#xff0c;用于批量的套用工作&#xff0c;例如說…

Python小數據池,代碼塊

今日內容一些小的干貨 一. id is 二. 代碼塊三. 小數據池四. 總結python小數據池&#xff0c;代碼塊的最詳細、深入剖析 一. id is 二. 代碼塊三. 小數據池四. 總結一&#xff0c;id&#xff0c;is&#xff0c; 在Python中&#xff0c;id是什么&#xff1f;id是內存地址…

【Wax】使用Wax (framework方式,XCode 4.6)

前情提示&#xff1a;【Wax】使用Wax &#xff08;非framework方式&#xff0c;XCode 4.6&#xff09; 這次&#xff0c;將以framework的方式來使用Wax 那么&#xff0c;讓我們開始吧&#xff01;&#xff01;&#xff01; 準備工作&#xff1a; 下載wax.framework&#xff1a;…

unity3d 簡單動畫

1&#xff0c;動畫系統配置 創建游戲對象并添加Animation組件&#xff0c;然后將動畫文件拖入組件。 進入動畫文件的Debug屬性面板 選中Legacy屬性 選中游戲對象&#xff0c;打開Animation編輯窗口 添加動畫變化屬性 需改關鍵幀的屬性值 配置完成后運行即可得到動畫效果 2&…