博客
关于我
强烈建议你试试无所不能的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

你可能感兴趣的文章
Windows下与Linux下编写socket程序的区别
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
高德开放平台推出LBS游戏行业解决方案提供专业地图平台能力支持
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
一分钟秒懂公有云、私有云、混合云......
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>
国家互联网应急中心何世平博士主题演讲
查看>>
洗茶,你误会了多少年?
查看>>