一、思路
通过上一篇文章,我们知道了如何获取个人url和url对应的增删改查,
(一)、获取个人的url和对应的url所在的目录
-
现在我们要做的是获取个人的url和对应的url所在的目录名,和url的名字
menu_leaf_list = list(
models.Url2Action.objects.filter(url2action2role__r__in=role_list) \
.exclude(url__menu__isnull=True).
values('url__menu', 'url__caption', 'url_id','url__url').distinct()
)
上面返回的样式是[{'url__menu':'对应菜单id','url__caption':'对应url的标题','url_id':'对应url的id','url__url':'对应url的地址'}]
(二)、重新编辑获取的目录格式
-
要考虑几点,第一点我们要展示的目录应该是,该用户所具备的才展示,第二点当用户通过url输入网址时能够打开对应的菜单显示
-
分析上面两点后我们需要对我们的叶子菜单做处理,思路是从底部找到根部
-
循环该用户的通过上面查询到的
menu_leaf_list
,我们重新设置一个字典k,v方便以后的使用 -
分别额外加了
status
,child
,opend
,一次用来找到自己上级目录作为标记,???,默认Flase当判断的当前url和现在一直找到自己上级目录标记 -
我们创建了个字典menu_leaf_dict ,用来重新格式化,格式化的格式
{'当前url标签id':[{.....},{.......}]}
-
在数据库的url用正则表示,和用户的url做对比,一样就给自己所在的opend标记为true
open_leaf_parent_id = None
menu_leaf_dict = {}
for item in self.menu_leaf_list:
item = {
'id': item['url_id'],
'url': item['url__url'],
'caption': item['url__caption'],
'parent_id': item['url__menu'],
'status': True,
'child': [],
# 判断菜单是否打开
'opend': False
}
if item['parent_id'] in self.menu_leaf_list:
menu_leaf_dict[item['parent_id']].append(item)
else:
menu_leaf_dict[item['parent_id']] = [item,]
# 在数据库的url用正则表示,和用户的url做对比
if re.match(item['url'],self.current_url):
item['opend'] = True
open_leaf_parent_id = item['parent_id']
# {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}
(三)、获取数据库目录表
获取整个目录结构,通过查目录表
menu_list = list(models.Menu.objects.values('id', 'caption', 'parent_id'))
(四)、把目录和个人权限统一格式
把目标也转换成个人权限的字典模式,所以要创建一个child,status,opend的k
# {1: {'id': 1, 'caption': '菜单1', 'child': [], 'parent_id': None},}
# 创建一个字典在里面加一个child key
menu_dict = {}
for item in self.menu_list:
item['child'] = []
item['status'] = False
item['opend'] = False
menu_dict[item['id']] = item
(五)、整合我们把个人目录和整体目录做合并
-
循环所有的个人目录列表,也就是
menu_leaf_dict
,因为现在和menu_dict
格式是一致的,我么要做的是看当前个人url,目录id和主目录id是否一致,如果一致我们把个v保存在主目录的child中 -
我们' parent_id = k'第一次k 等于当前个人url对应目录,我们找他的上级菜单的并吧
status
转换为true,然后再给'parent_id '重新赋值,获取这个目录的id,并吧他的上级目录stats
转化为True,直到根目录,因为根目录'parent_id '是None -
循环标记打开菜单 同理
for k, v in menu_leaf_dict.items():
menu_dict[k]['child'] = v
# 循环每一层的parent_id
parent_id = k
while parent_id:
menu_dict[parent_id]['status'] = True
parent_id = menu_dict[parent_id]['parent_id']
# 循环标记打开菜单
while open_leaf_parent_id:
menu_dict[open_leaf_parent_id]['opend'] = True
open_leaf_parent_id = menu_dict[open_leaf_parent_id]['parent_id']
(六)、把所有的根菜单放到主菜单下
-
循环刚才整理过的主菜单
menu_dict.values
-
除了主目录没有关联的
parent_id
其余目录都存在,我们找到每个菜单对应的父目录id,并且放入他们的url中 -
直到最后根目录是None,也就证明全部放完了,我们在吧这些放完的依次放到列表中存放
result = []
for row in menu_dict.values():
# 找到主菜单,主菜单自关联是None
if not row['parent_id']:
result.append(row)
else:
menu_dict[row['parent_id']]['child'].append(row)
return result
网友评论