权限分配之权限的展示

最后就是权限的展示了:
对前面的 总结:
  1. 一级菜单列表,是我对 menu表的,增删改查。
  2. 二级菜单列表,是我对Permission表中, 可以作为二级菜单存在,如 客户列表、账单列表的 增删改查
  3. 最后的权限展示,就是对Permission表中, 不能作为二级菜单, 但是他的pid字段,关联着 二级菜单权限的,例如 添加客户,编辑,删除客户这些权限的增删改查。

查:
对于查,好说。 差的内容就是, 基于二级菜单的 id 进行查找, 并且展示:
并且 这个 id 前面已经做过解释。 就是 get 请求 ?之后携带的数据。  sid=1 就是要查找的。 permission表中 pid字段与这个参数, 相等的,那些权限信息。

def menu_list(request):'''菜单和权限列表:param request::return:'''# menu_id = int(request.GET.get("mid"))  # 前端判断时,需要一个int类型,而不是str类型。menu_id = request.GET.get("mid")  # 或者在前端进行转换,将数字转换成,字符串second_menu_id = request.GET.get("sid")menu_list = models.Menu.objects.all()try:if menu_id:second_menus = models.Permission.objects.filter(menu_id=menu_id)else:second_menus = []if second_menu_id:permissions = models.Permission.objects.filter(pid=second_menu_id)else:permissions = []return render(request, "rbac/menu_list.html", locals())except ValueError as e:return HttpResponse("查找不存在")

 permissions 就是查询出来的结果。
为了防止,可能输入的不是。 数字格式,我做个 异常捕捉。 可以直接返回个404 也没问题。
然后看一下,三级菜单的。html代码:

<div class="col-md-5"><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><i class="fa fa-binoculars" aria-hidden="true"></i> 权限菜单{% if permissions and second_menus %}<a href=""class="right btn btn-success btn-xs"style="padding: 2px 8px;margin: -3px;"><i class="fa fa-plus-circle" aria-hidden="true"></i>新建</a>{% endif %}</div><!-- Table --><table class="table"><thead><tr><th>名称</th><th>URL & CODE</th><th>选项</th></tr></thead><tbody>{% for permission in permissions %}<tr class=""><th rowspan="2">{{ permission.title }}</th><td>{{ permission.name }}</td><td><a style="color: #333333;"href=""><i class="fa fa-edit" aria-hidden="true"></i></a><a style="color: #d9534f;"href=""><iclass="fa fa-trash-o"></i></a></td></tr><tr class=""><td colspan="2" style=" border-top: 0">{{ permission.url }}</td></tr>{% endfor %}</tbody></table></div></div>
View Code

只是展示, 连接的url, 下面写。

ok 再来想一想:
  是不是需要,让权限进行添加的时候, 也可以选择要往哪一个, 二级菜单下添加权限。 要的话就按照二级菜单新建的步骤,再来一遍就好。
  so  这次就,让这个权限, 默认就创建在,当前点击的这个二级菜单之下。 就不让用户进行选择了。  毕竟一般也用不到。
所以form要渲染的时候,就只剩下 三个字段  title  name  url

class PermissionForm(BootstrapModelForm):class Meta:model = models.Permissionfields = ["title", "name", "url"]

 BootstrapModelForm 是一个基类, 用以初始化 标签的样式:

class BootstrapModelForm(forms.ModelForm):'''因为,太多的地方需要使用, __init__ 初始化方式。来对每个标签添加 class="form-control" 所以搞个基类让要进行, 这部操作的 类去继承,'''def __init__(self, *args, **kwargs):super(BootstrapModelForm, self).__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs["class"] = "form-control"

 然后在 添加的视图中, 对于form.save() 之前, 需要将 pid 字段添加到 form中。然后才进行保存。 毕竟用户是没有输入这个字段的。

def permission_add(request, second_menu_id):'''添加权限:param request::param menu_id:  已经选中的二级菜单的id(用于设置默认值):return:'''if request.method == "POST":forms = PermissionForm(request.POST)if forms.is_valid():# 在添加页面,用户只输入了三个值 title url name 还需要一个 pid的值。 就是传递过来的second_menu_id# 并且传递过来的值,可以在数据库中找到对应的 记录,才行。 而且要在forms.save() 保存之前,加入到form中second_menu_obj = models.Permission.objects.filter(pk=second_menu_id).first()if not second_menu_obj:return HttpResponse("二级菜单存在,请重新选择")# forms.instance 中包含了用户提交的所有值。 他就是一个Permission对象:# instance = models.Permission(title="", name="", url="")  # 接收用户发来的数据# instance.pid = second_menu_obj 然后赋值时,就相当于pid = second_menu_obj。 orm操作,外键可以直接指定一个model对象# instance.save 然后保存整个内容。 这也是 forms.save 内部做的事情forms.instance.pid = second_menu_objforms.save()return redirect(memory_reverse(request, "rbac:menu_list"))else:return render(request, "rbac/change.html", {"forms": forms})forms = PermissionForm()# 为一级菜单menu字段, 添加默认值。return render(request, "rbac/change.html", {"forms": forms})
添加权限的 视图函数:

已经有了, 是点击哪一个 二级菜单过来的记录   second_menu_id
所以先进行,验证一下。  看一下在数据库中是否有这个 主键 id=second_menu_id  的记录存在。
然后将这条记录, 交给 pid 。 做一个关联。   orm 是支持在关联时,直接使用一个model对象对字段进行赋值的。

forms.instance 中包含了用户提交的所有值。 他就是一个Permission对象:
  instance = models.Permission(title="", name="", url="")  # 接收用户发来的数据
  instance.pid = second_menu_obj 然后赋值时,就相当于pid = second_menu_obj。 orm操作,外键可以直接指定一个model对象
  instance.save 然后保存整个内容。 这也是 forms.save 内部做的事情


forms.instance.pid = second_menu_obj  直接为pid 进行赋值。 然后form.save  保存到数据库

 

转载于:https://www.cnblogs.com/chengege/p/10712825.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/425083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优先队列----堆

问题 打印机打印作业一般是放在队列中的。如果按照先来先打印的顺序&#xff0c;有一个100页的打印任务&#xff0c;那么会让后面短小的任务等待很长时间。更合理的做法也许是最后处理最耗时的打印任务&#xff0c;不管它是不是最后提交上来的。 在多用户操作系统中&#xff…

第三十四期:游戏开发中常见的10种编程语言

游戏开发是非常有经验和熟练的程序员的工作。 它可能花费数亿美元。 这是一项非常有创意的工作&#xff0c;也需要技术水平。 他们需要具有特定需求的编程语言。 游戏开发是非常有经验和熟练的程序员的工作。 它可能花费数亿美元。 这是一项非常有创意的工作&#xff0c;也需要…

[Leetcode][第5458题][JAVA][字符串的好分割数目][双指针][HashSet]

【问题描述】5458. 字符串的好分割数目[中等] 【解答思路】 1. 双指针 前面的搜索前面的个数和&#xff0c;后面的搜索后面的个数和 时间复杂度&#xff1a;O(N^2) 空间复杂度&#xff1a;O(1) class Solution {/*双指针做法&#xff0c;前面的搜索前面的个数和&#xff0c;…

第三十五期:AI核心难点之一:情感分析的常见类型与挑战

情感分析或情感人工智能&#xff0c;在商业应用中通常被称为意见挖掘&#xff0c;是自然语言处理(NLP)的一个非常流行的应用。文本处理是该技术最大的分支&#xff0c;但并不是唯一的分支。情绪AI有三种类型及其组合。 情感分析或情感人工智能&#xff0c;在商业应用中通常被称…

[Leetcode][第104题][JAVA][二叉树的最大深度][递归][BFS]

【问题描述】[简单] 【解答思路】 1. 递归 终止条件/基本情况 root null 递推关系 max(l,r)1 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(height) class Solution {public int maxDepth(TreeNode root) {if (root null) {return 0;} else {int leftHeight ma…

第三十六期:人工智能统计调查:86%的消费者更喜欢人工客服

美国消费者越来越不愿意与聊天机器人聊天&#xff0c;人们对人工智能作为关键业务组成部分的期望越来越高&#xff0c;由于部署这项新技术导致员工技能差距越来越大。 最近一些人工智能的健康和进展状况相关调查、研究、预测和其他定量评估突显出以下几点&#xff1a;美国消费者…

[Leetcode][第111题][JAVA][BFS][二叉树的最小深度][BFS][递归]

【问题描述】[简单] 【解答思路】 1. 递归 自下而上 基本情况/结束条件 &#xff1a; 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点 当 root 节点左右孩子都为空时&#xff0c;返回 1 当 root 节点左右孩子有一个为空时&#xff0c;返回不为空的孩子节点的深度 当…

75 jsp基础语法汇总

JSP语法 脚本程序 脚本程序可以包含任意量量的Java语句句、变量量、⽅方法或表达式&#xff0c;只要它们在脚本语⾔言 中是有效的。 脚本程序的语法格式&#xff1a; <% 代码⽚片段 %>或者&#xff0c;您也可以编写与其等价的XML语句句&#xff0c;就像下⾯面这样&#…

[递归]一文看懂递归

1. 递归的定义 编程语言中&#xff0c;函数 Func(Type a,……) 直接或间接调用函数本身&#xff0c;则该函数称为「递归函数」。 在实现递归函数之前&#xff0c;有两件重要的事情需要弄清楚: 递推关系&#xff1a;一个问题的结果与其子问题的结果之间的关系。基本情况&…

[Leetcode][第206题][JAVA][反转一个单链表][递归][迭代]

【问题描述】[简单] 【解答思路】 1. 递归 自底向上 基本条件/终止条件&#xff1a;当前节点或者下一个节点null 递推关系&#xff1a; head.next.next head 在函数内部&#xff0c;改变节点的指向&#xff0c;也就是 head 的下一个节点指向 head 递归函数那句 时间…

3.项目的基本概念

项目的基本概念 项目及其特征

[Leetcode][程序员面试金典][面试题08.03][JAVA][魔术索引][递归][优化]

【问题描述】[简单] 【解答思路】 1. 逐个查找 时间复杂度&#xff1a;O(N) 空间复杂度&#xff1a;O(1) public int findMagicIndex(int[] nums) {for (int i 0, length nums.length; i < length; i) {if (i nums[i])return i;}return -1;}2. 逐个查找优化 有序升序…

5如何让进行项目管理

项目管理分为五个过程组

第一章 概率论的基本概念

概率论与数理统计的学习内容来源于中国大学MOOC&#xff0c;以及参考书籍《概率论与数理统计》第四版&#xff0c;浙江大学。 随机现象  在一定条件下&#xff0c;有可能出现多种结果&#xff1b;而且在事情发生前不能知道结果。 随机试验  概念&#xff1a;对随机现象的…

【知识导图】数据结构与算法

[基础知识点] 10 个数据结构&#xff1a;数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树&#xff1b; 10 个算法&#xff1a;递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法 [学习技巧] 学习它的“来历”“…

第三十七期:刷脸支付叫好不叫座,为啥消费者和商家都不愿用先进科技?

移动支付相信大多数人都不陌生&#xff0c;中国移动支付的普及被人称为“新四大发明”&#xff0c;在中国移动支付产品发展如火如荼的今天&#xff0c;刷脸支付成为了新的时尚&#xff0c;然而这个时尚的支付方式却显得叫好不叫座&#xff0c;刷脸支付的问题到底出在哪了? 移动…