当前位置: 首页 > 编程日记 > 正文

权限组件(10):三级菜单的展示和增删改查

效果图:

三级菜单的实现和一级、二级菜单差不多。需要注意的是增加三级菜单时,三级菜单是用户提交后在后台通过二级菜单的id添加的。

一、路由分发

rbac/urls.py

...
from django.urls import re_pathfrom rbac.views import menu
...urlpatterns = [...# 三级菜单re_path(r'^permission/add/(?P<second_menu_id>\d+)/$', menu.permission_add, name='permission_add'),re_path(r'^permission/edit/(?P<pk>\d+)/$', menu.permission_edit, name='permission_edit'),re_path(r'^permission/del/(?P<pk>\d+)/$', menu.permission_del, name='permission_del'),...
]

二、forms表单验证

rbac/forms/base.py

from django import formsclass BaseBootStrapForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)for name, field in self.fields.items():field.widget.attrs['class'] = 'form-control'

rbac/forms/menus.py

...
from rbac import models
from rbac.forms.base import BaseBootStrapForm
......
class PermissionModelForm(BaseBootStrapForm):class Meta:model = models.Permissionfields = ['title', 'name', 'url']
...

三、视图函数

rbac/views/menu.py

from django.shortcuts import HttpResponse, render, redirect, reversefrom rbac import models
from rbac.forms.menu import MenuModelForm, SecondMenuModelForm, PermissionModelForm
from rbac.service.urls import memory_reversedef menu_list(request):"""菜单和权限列表:param request::return:"""menu_queryset = models.Menu.objects.all()menu_id = request.GET.get('mid')  # 用户选择的一级菜单
menus_exists = models.Menu.objects.filter(id=menu_id).exists()if not menus_exists:menu_id = Noneif menu_id:second_menus = models.Permission.objects.filter(menu_id=menu_id)else:second_menus = []second_menu_id = request.GET.get('sid')  # 用户选择的二级菜单  #  +
second_menus_exists = models.Permission.objects.filter(id=second_menu_id).exists()  #  +if not second_menus_exists:  #  +second_menu_id = None  #  +if second_menu_id:  #  +permissions = models.Permission.objects.filter(pid__id=second_menu_id)  #  +else:  #  +permissions = []  #  +
context = {'menu_list': menu_queryset,'menu_id': menu_id,'second_menus': second_menus,'second_menu_id': second_menu_id,'permissions': permissions  #  +
    }return render(request, 'rbac/menu_list.html', context)...# 权限的增删改def permission_add(request, second_menu_id):"""添加权限:param request::param pk::return:"""if request.method == 'GET':forms = PermissionModelForm()return render(request, 'rbac/change.html', {'forms': forms})forms = PermissionModelForm(data=request.POST)if forms.is_valid():second_menu_obj = models.Permission.objects.filter(id=second_menu_id).first()if not second_menu_obj:return HttpResponse('二级菜单不存在,请重新选择')forms.instance.pid = second_menu_obj  # form.instance中包含用户提交的所有值
        forms.save()url = memory_reverse(request, 'rbac:menu_list')return redirect(url)return render(request, 'rbac/change.html', {'forms': forms})def permission_edit(request, pk):"""权限编辑:param request::param pk: 要编辑的权限id:return:"""permission_obj = models.Permission.objects.filter(id=pk).first()if request.method == 'GET':forms = PermissionModelForm(instance=permission_obj)return render(request, 'rbac/change.html', {'forms': forms})forms = PermissionModelForm(data=request.POST, instance=permission_obj)if forms.is_valid():forms.save()url = memory_reverse(request, 'rbac:menu_list')return redirect(url)return render(request, 'rbac/change.html', {'forms': forms})def permission_del(request, pk):"""权限删除:param request::param pk::return:"""menu_list_url = memory_reverse(request, 'rbac:menu_list')if request.method == 'GET':return render(request, 'rbac/delete.html', {'cancel': menu_list_url})models.Permission.objects.filter(id=pk).delete()return redirect(menu_list_url)

四、模板渲染

rbac/templates/menu_list.html

{% extends 'layout.html' %}
{% load rbac %}<style>tr.active {border-left: 3px solid #fdc00f;}
</style>{% block content %}<div class="luffy-container"><!-- 一级菜单 --><div class="col-md-3"><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><i class="fa fa-book" aria-hidden="true">一级菜单</i><a href="{% memory_url request 'rbac:menu_add' %}" class="right btn btn-success btn-xs"style="padding: 2px 8px;margin:-3px"><i class="fa fa-plus-circle" aria-hidden="true">新建</i></a></div><!-- Table --><table class="table"><thead><tr><th>名称</th><th>图标</th><th>选项</th></tr></thead><tbody>{% for menu in menu_list %}<!-- 管道符可以将后端传来的整型,转换成字符串 --><tr class="{% if menu.id|safe == menu_id %}active{% endif %}"><td><a href="?mid={{ menu.id }}">{{ menu.title }}</a></td><td><i class="fa {{ menu.icon }}" aria-hidden="true"></i></td><td><a style="color: #333333; font-size:18px"href="{% memory_url request 'rbac:menu_edit' pk=menu.id %}"><i class="fa fa-edit" aria-hidden="true"></i></a><a style="color: red; font-size:18px"href="{% memory_url request 'rbac:menu_del' pk=menu.id %}"><i class="fa fa-trash-o" aria-hidden="true"></i></a></td></tr>{% endfor %}</tbody></table></div></div><!-- 二级菜单 --><div class="col-md-4"><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><i class="fa fa-flag" aria-hidden="true">二级菜单</i>{% if menu_id %}<a href="{% memory_url request 'rbac:second_menu_add' menu_id=menu_id %}"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><td>名称</td><td>CODE&URL</td><td>选项</td></tr></thead><tbody>{% for second_menu in second_menus %}<!-- 管道符可以将后端传来的整型,转换成字符串 --><tr class="{% if second_menu.id|safe == second_menu_id %}active{% endif %}"><td rowspan="2"><a href="?mid={{ menu_id }}&sid={{ second_menu.id }}">{{ second_menu.title }}</a></td><td>{{ second_menu.name }}</td><td><a href="{% memory_url request 'rbac:second_menu_edit' pk=second_menu.id %}"style="color:#333333;font-size:18px;"><i class="fa fa-edit" aria-hidden="true"></i></a><a href="{% memory_url request 'rbac:second_menu_del' pk=second_menu.id %}"style="color:red;font-size:18px;"><i class="fa fa-trash-o" aria-hidden="true"></i></a></td></tr><tr class="{% if second_menu.id|safe == second_menu_id %}active{% endif %}"><td colspan="2" style="border-top:0;">{{ second_menu.url }}</td></tr>{% endfor %}</tbody></table></div></div><!-- 权限表 --><div class="col-md-5"><div class="panel panel-default"><!-- Default panel contents --><div class="panel-heading"><i class="fa fa-bookmark" aria-hidden="true">三级菜单</i>{% if menu_id %}{% if second_menu_id %}<a href="{% memory_url request 'rbac:permission_add' second_menu_id=second_menu_id %}"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 %}{% endif %}</div><!-- Table --><table class="table"><thead><tr><td>名称</td><td>CODE&URL</td><td>选项</td></tr></thead><tbody>{% for permission in permissions %}<tr><td rowspan="2">{{ permission.title }}</td><td>{{ permission.name }}</td><td><a href="{% memory_url request 'rbac:permission_edit' pk=permission.id %}"style="color:#333333;font-size:18px;"><i class="fa fa-edit" aria-hidden="true"></i></a><a href="{% memory_url request 'rbac:permission_del' pk=permission.id %}"style="color:red;font-size:18px;"><i class="fa fa-trash-o" aria-hidden="true"></i></a></td></tr><tr><td colspan="2" style="border-top:0;">{{ permission.url }}</td></tr>{% endfor %}</tbody></table></div></div></div>{% endblock content %}

需要注意的是选择了一级和二级菜单后才会显示三级菜单的相关信息。增删改页面无需变动。

转载于:https://www.cnblogs.com/lshedward/p/10509290.html

相关文章:

ROS知识(4)----初级教程之常见问题汇总

一、开机启动ROS的工作空间的路径设置失败 现象&#xff1a;在教程&#xff1a;http://wiki.ros.org/cn/ROS/Tutorials/CreatingPackage中的第5.1小节&#xff0c;运行以下命令失败&#xff1a; $ rospack depends1 beginner_tutorials 提示错误&#xff1a;[rospack] Error: …

sql server 海量数据速度提升:SQL优化-索引(11) 【转】

12、高效的TOP 事实上&#xff0c;在查询和提取超大容量的数据集时&#xff0c;影响数据库响应时间的最大因素不是数据查找&#xff0c;而是物理的I/0操作。如&#xff1a; select top 10 * from ( select top 10000 gid,fariqi,title from tgongwen where neibuyonghu办公室or…

java重定向带参数_急 求助重新封装重定向带参数问题

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼这是我写的代码 不知道行不行 求助package base.web.resolver.result;import java.util.HashMap;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.logging.log4j.…

Java程序员从笨鸟到菜鸟之(五)java开发常用类(包装,数字处理集合等)(下)...

本文来自&#xff1a;曹胜欢博客专栏。转载请注明出处&#xff1a;http://blog.csdn.net/csh624366188 写在前面&#xff1a;由于前天项目老师建设局的项目快到验收阶段&#xff0c;所以&#xff0c;前天晚上通宵&#xff0c;昨天睡了大半天&#xff0c;下午我们宿舍聚会&#…

对数组中的数字 1 和 2 进行排序,使得数字 1、2 分别位于前、后部分

问题描述&#xff1a;假设某个数组中只有数字 1 和 2&#xff0c;进行排序&#xff0c;使得数字 1 位于数组前部分&#xff0c;数字 2 位于后部分。 这道算法题其实不是很难&#xff0c;使用各种排序算法应该都能解出&#xff0c;但是若要考虑性能问题&#xff0c;那就得选择一…

@class和#import

class 作用&#xff1a; 可以简单的引用一个类 简单使用&#xff1a; class Dog; 仅仅是告诉编译器&#xff0c;Dog是一个类&#xff1b;并不会包含Dog这个类的所有内容 具体使用&#xff1a; 在.h文件中使用class引用一个类 在.m文件中使用#import包含这个类的.h文件 作用上的…

java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼界面是package 界面类;import javax.jws.soap.SOAPBinding.Use;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing…

C# 汉字编码GB2312转换

功能界面 源码&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace wordsConvert {public partial class Fo…

python批量爬取文档

最近项目需要将批量链接中的pdf文档爬下来处理&#xff0c;根据以下步骤完成了任务&#xff1a; 将批量下载链接copy到text中&#xff0c;每行1个链接&#xff1b;再读txt文档构造url_list列表&#xff0c;利用readlines返回以行为单位的列表&#xff1b;利用str的rstrip方法&a…

[Android]webview直接加载网页允许JS,进度条,当前应用内跳转

webview&#xff0c;用于在应用里面直接加载网页本代码参考了&#xff1a;官方的webview实例介绍&#xff1a;https://developer.android.com/guide/tutorials/views/hello-webview.html 加上进度条&#xff1a; http://blog.csdn.net/stoneson/article/details/6068089 整个源…

ubuntu 14.04 安装java_Ubuntu 14.04中安装Java

第三&#xff1a;在Ubuntu 和 Linux Mint上安装Java看了各种类型"java";的不同之后&#xff0c;让我们看如何安装他们。1)在Ubuntu和Linux Mint上安装JRE打开终端&#xff0c;使用下面的命令安装JRE&#xff1a;sudo apt-get install default-jre2)在Ubuntu和Linux M…

C# 生成系统唯一号

生成唯一号&#xff1a;思路&#xff0c;根据yymmddhhmmss自增长号唯一服务器号( SystemNo)生成唯一码&#xff0c;总长度19&#xff0c;例如&#xff1a;1509281204550000101. public class UniqueNumber{private static long num 0;//流水号private static object lockObj …

EBS上用过的一些接口表整理信息

AP接口表&#xff1a;AP_INVOICES_INTERFACEAP_INVOICE_LINES_INTERFACE涉及的请求&#xff1a;应付款管理系统开放接口导入涉及案例&#xff1a; 运费导AP、费用导APPO接口表&#xff1a;申请&#xff1a;PO_REQUISITIONS_INTERFACE_ALL涉及请求&#xff1a;导入申请采购&…

linux源码编译安装nginx

1.从nginx的官方网站下载nginx的安装源码包&#xff0c;要下载.gz格式的包才是linux安装包 网址http://nginx.org/download/ wget http://nginx.org/download/nginx-1.5.9.tar.gz 2.解压 tar -zxvf nginx-1.5.9.tar.gz yum -y install pcre-devel gcc gcc-c autoconf automak…

usr share里没有mysql_无法在ubuntu 12.04上安装mysql,找不到消息文件’/usr/share/mysql/errmsg.sys’...

尝试使用apt-get安装mysql但它失败了# apt-get install MysqL-serverReading package lists... DoneBuilding dependency treeReading state information... DoneThe following extra packages will be installed:MysqL-server-5.5Suggested packages:tinycaThe following NEW …

android:更改PagerTabStrip背景颜色,标题字体样式、颜色和图标,以及指示条的颜色...

1.更改PagerTabStrip背景颜色我们直接在布局中设置background属性可以&#xff1a;<android.support.v4.view.ViewPagerandroid:id"id/pager"android:layout_width"fill_parent"android:layout_height"fill_parent" ><android.support.…

敏捷开发日常跟进系列之二:燃尽图(中)

这是敏捷开发日常跟进系列的第二篇&#xff08;栏目目录&#xff09;。 迭代及燃尽图的目标 燃尽图的目标是完成迭代的目标&#xff0c;迭代的目标是什么呢&#xff1f; 1. 按产品经理的要求&#xff0c;交付计划会中计划的用户故事 2. 尽量完成1 之后还会看到&#xff0c;这个…

[python][jupyter notebook]之菜鸟安装[pyecharts]中Geo或Map显示问题

作为菜鸟&#xff0c;在学习使用pyecharts模块进入jupyter notebook的时候&#xff0c;又遇到了问题——那就是&#xff0c;可以使用一下代码&#xff0c;导入Geo和Map模块&#xff0c;但是弄了之后看不见地图。 from pyecharts import Geo from pyecharts import Map 所以&…

c语言多线程mysql_多线程读写mysql数据库

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼unsigned int __stdcall scan(PVOID pM){char ip[20];strcpy(ip, (char*)pM);MYSQL mysql;MYSQL_RES* result;//初始化mysql句柄mysql_init(&mysql);//连接mysql数据库if(!mysql_real_connect(&mysql,"localhost"…

[C#,Java,PHP] - IMAP文件夹名称编码和解码方法

[C#] 来源&#xff1a;http://www.oschina.net/code/snippet_110991_2237 // 编码private string IMAPEncode(string folder){string rtn "", base64;int index 0; Regex regAsis new Regex("\G(?:[\x20-\x25\x27-\x7e])"); Regex reg26 new Rege…

fzu 2150 Fire Game 【身手BFS】

称号&#xff1a;fzu 2150 Fire Game &#xff1a;给出一个m*n的图&#xff0c;‘#’表示草坪&#xff0c;‘ . ’表示空地&#xff0c;然后能够选择在随意的两个草坪格子点火。火每 1 s会向周围四个格子扩散&#xff0c;问选择那两个点使得燃烧全部的草坪花费时间最小&#xf…

K-Means聚类算法原理

来自&#xff1a;https://www.cnblogs.com/pinard/p/6164214.html K-Means算法是无监督聚类算法&#xff0c;它有很多变体。包括初始化优化K-Means&#xff0c;距离计算优化elkan K-Means算法和大样本优化Mini Batch K-Means算法。 1. K-Means原理 K-Means算法思想&#xff1a;…

safari java插件故障_safari flash插件故障怎么办 mac safari flash插件故障解决方法

近几日&#xff0c;许多网友都在关注safari flash插件故障怎么办 mac safari flash插件故障解决方法这个话题&#xff0c;那么safari flash插件故障怎么办 mac safari flash插件故障解决方法具体情况是怎么样的呢&#xff1f;safari flash插件故障怎么办 mac safari flash插件故…

Traveller项目介绍

Traveller&#xff0c;翻译为旅行家&#xff0c;是我用来实践最佳web技术的项目&#xff0c;主题是一个给旅行爱好者提供旅行信息的网站。 目标是组合现最流行的web技术&#xff0c;实现符合中国用户使用习惯的网站。 相关网址 Git&#xff1a;https://github.com/mingziday/Tr…

窗口之间传递消息的一个方法

发送窗口的代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Wi…

docker制作镜像篇(基于容器)

docker制作镜像可以有两种方式&#xff1a;一、基于容器&#xff08;使用busybox制作http镜像&#xff09;1.首先运行一个容器2.在容器当中配置自己的http&#xff0c;添加web目录&#xff0c;增加主页文件等。3.查看原busybox运行容器时的默认启动程序&#xff08;原运行命令为…

java+js上传图片_java+ jsp+js 实现富文本编辑和上传图片功能

class FileManageActionController extends BaseAction{// windowsprivate String PATH_LINEs "\\";// linuxprivate String PATH_LINE "/";/*** 文件上传* param request {link HttpServletRequest}* param response {link HttpServletResponse}* retur…

Outlook接收qq的邮件

1.先去qq邮箱&#xff0c;设置&#xff0c;账户 开启pop3服务&#xff0c;假如之前开启过&#xff0c;最好关闭之后重新开启 最新版本的必须使用邮箱的独立密码才可以收取邮件 (否则就算你之前开通了&#xff0c;也无法用你的qq账号和密码收取邮件的) 2.高级设置里面&#xff0…

架构设计复杂度的6个来源

谈到架构设计&#xff0c;相信每个技术人员都耳熟能详。我总结了三个架构设计相关的特性&#xff1a; 架构设计的思维和程序设计的思维差异很大。架构设计没有体系化的培训和训练机制。程序员对架构设计的理解存在很多误区。 所以&#xff0c;虽然每个程序员心中都有一个成为架…

java swt 画按钮_向表中添加按钮(java swt)

我正在尝试复制类似于此的UI&#xff1a;我一直在关注如何创建表格每列中的按钮的作者说明(没有成功).我的项目与他的区别在于我正在尝试使用Tree而不是Table,而我正在使用eclipse TreeViewer插件进行上下文.从理论上讲,实现似乎应该是直截了当的,但我似乎无法让它发挥作用.这是…