博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
权限组件(10):三级菜单的展示和增删改查
阅读量:6501 次
发布时间:2019-06-24

本文共 6672 字,大约阅读时间需要 22 分钟。

效果图:

 

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

一、路由分发

rbac/urls.py

...from django.urls import re_pathfrom rbac.views import menu...urlpatterns = [    ...    # 三级菜单    re_path(r'^permission/add/(?P
\d+)/$', menu.permission_add, name='permission_add'), re_path(r'^permission/edit/(?P
\d+)/$', menu.permission_edit, name='permission_edit'), re_path(r'^permission/del/(?P
\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 modelsfrom rbac.forms.base import BaseBootStrapForm......class PermissionModelForm(BaseBootStrapForm):    class Meta:        model = models.Permission        fields = ['title', 'name', 'url']...

 

三、视图函数

rbac/views/menu.py 

from django.shortcuts import HttpResponse, render, redirect, reversefrom rbac import modelsfrom rbac.forms.menu import MenuModelForm, SecondMenuModelForm, PermissionModelFormfrom 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 = None    if 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 %}{% block content %}    
{% for menu in menu_list %}
{% endfor %}
名称 图标 选项
{% if menu_id %}
{% endif %}
{% for second_menu in second_menus %}
{% endfor %}
名称 CODE&URL 选项
{ { second_menu.title }} { { second_menu.name }}
{ { second_menu.url }}
{% if menu_id %} {% if second_menu_id %}
{% endif %} {% endif %}
{% for permission in permissions %}
{% endfor %}
名称 CODE&URL 选项
{ { permission.title }} { { permission.name }}
{ { permission.url }}
{% endblock content %}

 

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

 

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

你可能感兴趣的文章
Web安全实践(15)CSRF(跨站请求伪造)-从校内的插入图片说起
查看>>
Wind7外接显示器选择拓展模式后,鼠标只能往右移动才能切换到外接显示器上,不能修改切换方向...
查看>>
MVC TIP8:为控制器增加有参构造函数(为了注入等其它用途)
查看>>
使用Keil MDK以及标准外设库创建STM32工程
查看>>
Gvr SDK for Unity 分析(二)
查看>>
字典的基本概念和常用方法
查看>>
2007浙大复试上机考试题目2--统计字符
查看>>
RMAN duplciate 准备时,需要检查的target数据库参数内容
查看>>
15.5. 图片优化
查看>>
2014年终总结回顾与2015年工作总结
查看>>
XEN cpu 调度问题
查看>>
基于jQuery的下拉菜单插件,诸位上眼!!!
查看>>
Silverlight 解谜游戏 之二 创建题板
查看>>
Linux TC基于HTB队列的流量管理范例
查看>>
静态代码块和非静态代码块的比较
查看>>
hihoCoder #1094 : Lost in the City(枚举,微软苏州校招笔试 12月27日 )
查看>>
3.2. Module
查看>>
Linux~其实shell脚本也很简单
查看>>
爱上MVC3~将系统的路由设置抽象成对象吧
查看>>
secureCRT linux shell显示中文乱码 解决方法
查看>>