先来看一看我的,数据库的表:
权限表:Permission
一级菜单表: Menu
再看看,二级菜单的, 页面效果图:
分析一波:
1. 二级菜单是建立在一级菜单的基础上,进行展示。 这就又使用到,如何保留原搜索信息的方法, 关于携带参数的问题?
2. 然后 二级菜单不需要单独的, 展示页面, 与 一级菜单使用同一个就可以。
3. 新建时二级菜单时,需要明确的知道,我这个二级菜单 是 属于哪一个 一级菜单。 所以在进入 二级菜单添加页面时, 需要的参数又有一个 Menu_id 一级菜单的id
OK 话不多说:上代码:
先看一看url 路由的设置:
re_path(r"^second/menu/add/(?P<menu_id>\d+)/$", menu.second_menu_add, name="second_menu_add"),
re_path(r"^second/menu/edit/(?P<pk>\d+)/$", menu.second_menu_edit, name="second_menu_edit"),
re_path(r"^second/menu/del/(?P<pk>\d+)/$", menu.second_menu_del, name="second_menu_del"),
因为展示页面的 url 使用的还是, 一级菜单的路由。所以来看一看对, 一级菜单路由的 一点改动:
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()
if menu_id:
second_menus = models.Permission.objects.filter(menu_id=menu_id)
else:
second_menus = []
return render(request, "rbac/menu_list.html", locals())
二级菜单,多了一个需要传递的参数 sid。并且需要在Permission表中找到,属于当前点击的 一级菜单的 二级菜单(也就是 权限表中, menu_id有值的字段)
如果一级菜单也就是 GET 请求有把一级菜单的 id 发送过来, 那么就是用户在访问二级菜单,需要查找出来。
如果没有这个值, 那么用户就只是在访问,一级菜单。 二级菜单列表, 就应该为空。
看看 页面模板的设计: 这里才是改动较大的地方:
<div class="col-md-4"> <div class="panel panel-default"> <!-- Default panel contents --> <div class="panel-heading"><i class="fa fa-binoculars" aria-hidden="true"></i> 二级菜单 {% if second_menus %} <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> <th>名称</th> <th>URL & CODE</th> <th>选项</th> </tr> </thead> <tbody> {% for menu in second_menus %} <tr class="{% if second_menu_id == menu.pk|safe %}active{% endif %}"> <th rowspan="2"><a href="?mid={{ menu_id }}&sid={{ menu.pk }}">{{ menu.title }}</a></th> <td>{{ menu.name }}</td> <td> <a style="color: #333333;" href="{% memory_url request 'rbac:second_menu_edit' pk=menu.pk %}"> <i class="fa fa-edit" aria-hidden="true"></i></a> <a style="color: #d9534f;" href="{% memory_url request 'rbac:second_menu_del' pk=menu.pk %}"><i class="fa fa-trash-o"></i></a> </td> </tr> <tr class="{% if second_menu_id == menu.pk|safe %}active{% endif %}"> <td colspan="2" style=" border-top: 0">{{ menu.url }}</td> </tr> {% endfor %} </tbody> </table> </div> </div>