进行展示的时候, 肯定是通过formset 来完成这项工作。
1. 获取项目中所有的,想要的权限。 比如保存在一个集合中。 set1
2. 获取数据库中,已经录入了的所有权限。 保存在另一个集合中。 set2
下面 就出现了三种情况:(这里还是需要通过name字段,来进行 判断。 两个集合)
情况一: set1 比 set2 多。 说明就要把 多出来的 添加到数据库。 批量添加
情况二: set1 比 set2 少。说明中途可能弃用了一部分url。 数据库就要删除这部分。 批量删除。
情况三: set1 和 set2 一样多。 但是可能url 改变了。 所以就需要将 set1 中查出的 与 set2 中中查出的, name一样。 url 不一样的,进行批量更新。
OK 大概也就这三种情况: 一个一个的实现:
1. 我已经从项目中获取了,所有的url。 还需要把数据库中,保存着的 permission 的所有信息全部拿到。
permissions = models.Permission.objects.all().values("pk", "title", "name", "url", "menu_id", "pid_id") permission_dict = OrderedDict() permission_name_set = set() for row in permissions: permission_dict[row.get("name")] = row permission_name_set.add(row.get("name"))
在这里也是使用的 OerderdDict 有序字典。
然后放入到了一个 集合当中。 这个集合只放了 每一条记录中的 name 字段的。 信息。
看看什么样:
permission_name_set:
{'role_edit', 'customer_edit', 'payment_add', 'payment_list', 'payment_del', 'second_menu_del', 'role_list', 'menu_list',
'menu_del', 'customer_del', 'user_list', 'customer_import', 'user_add', 'user_del', 'permission_edit', 'permission_add',
'customer_tpl', 'reset_pwd', 'second_menu_add', 'menu_add', 'customer_list', 'menu_edit', 'user_edit', 'payment_edit',
'second_menu_edit', 'permission_del', 'customer_add', 'role_add', 'role_del'}
自动获取, 得到的也是一个字典。 也需要将每一个 字典的key 保存到一个集合当中:
all_url_dict = get_all_url_dict()
router_name_set = set(all_url_dict.keys())
router_name_set:
{'role_edit', 'customer_edit', 'payment_add', 'multi_permissions', 'payment_list', 'payment_del', 'second_menu_del', 'role_list',
'menu_list', 'menu_del', 'customer_del', 'user_list', 'customer_import', 'user_add', 'user_del', 'permission_edit',
'permission_add', 'customer_tpl', 'reset_pwd', 'second_menu_add', 'menu_add', 'customer_list', 'menu_edit', 'user_edit',
'payment_edit', 'second_menu_edit', 'permission_del', 'customer_add', 'role_add', 'role_del'}
两个集合有了: 该做差集 并集 操作了!
情况一。 添加操作: 自动获取中有的, 数据库没有的, 需要进行添加到数据库:
# 3.1 计算出应该添加的name 并生成 formset (自动发现有的,数据库没有的。所以要循环的是 自动发现查询出的字典) generate_name_list = router_name_set - permission_name_set # 增加列表 generate_formset_class = formset_factory(MultiAddPermissionForm, extra=0) generate_formset = generate_formset_class( initial=[row_dict for name, row_dict in all_url_dict.items() if name in generate_name_list])
这里有关 formset的操作,不再说: