首先需要設計表結構,包含父子關聯關係,例如
class
menu
(models.model)
:"""
許可權"""
title = models.charfield(max_length=
128, unique=
true
, verbose_name=
"標題"
) name = models.charfield(max_length=
128, unique=
true
, verbose_name=
"編碼"
) path = models.charfield(max_length=
256, blank=
true
, null=
true
, verbose_name=
'含正則的url'
) parent_id = models.integerfield(verbose_name=
'父選單id'
)
編寫生成tree方法,具體用法看說明,呼叫方式get_trees(menu.objects.values().all())
# 生成樹結構
defget_trees
(data,
key_column=
'id'
, parent_column=
'parent_id'
, child_column=
'children'
, current_column=
none
, current_path=
none):
""" :param data: 資料列表
:param key_column: 主鍵字段,預設id
:param parent_column: 父id欄位名,父id預設從0開始
:param child_column: 子列表字典名稱
:param current_column: 當前展開值欄位名,若找到展開值增加['open'] = '1'
:param current_path: 當前展開值
:return: 樹結構
"""data_dic =
for d in data:
data_dic[d.get(key_column)
]= d # 以自己的許可權主鍵為鍵,以新構建的字典為值,構造新的字典
data_tree_list =
# 整個資料大列表
for d_id, d_dic in data_dic.items():
pid = d_dic.get(parent_column)
# 取每乙個字典中的父id
ifnot pid:
# 父id=0,就直接加入資料大列表
else
:# 父id>0 就加入父id隊對應的那個的節點列表
try:
# 判斷異常代表有子節點,增加子節點列表=
data_dic[pid]
[child_column]
except keyerror:
data_dic[pid]
[child_column]=[
] data_dic[pid]
[child_column]
# 展開節點
if current_path:
if current_path == d_dic.get(current_column)
: d_dic[
'open']=
'1'while pid:
data_dic[pid]
['open']=
'1' pid = data_dic[pid]
[parent_column]
return data_tree_list
Java 生成樹形選單
分享乙個 樹形選單,一般生成樹形選單都是通過遞迴遍歷,或者 通過 nosql 儲存 此篇 介紹乙個 遞迴 樹形選單的 工具類 廢話不多說 上 author 作者 小布 version 建立時間 2019年3月18日 下午3 01 27 explain 類說明 樹形選單 public final cl...
vue element樹形結構右鍵選單
環境 vue admin template vue 2.6.10 element ui 2.7.0 1 自定義元件,檔案位置 src components mentcontext dropmenu style style style display block v show show mousedo...
通過lambda實現選單樹形結構
public list listwithtree sorted menu1,menu2 collect collectors.tolist return level1menus 遞迴查詢當前選單的子選單 param root param all return private list getchil...