权限分配之一级菜单保留原搜索条件

如何一直携带 当前GET请求中, ?mid=1&age=2&name=alex
先看一看问题的产生:
1.我的菜单列表页面,当我点击,某一个菜单选项时。会发送一个GET请求,并且将当前这个菜单的 id 发送到服务端。
服务端进行页面渲染时, 会为这个菜单添加一个,calss="active":
看代码:

                        <tr class="{% if menu_id == menu.pk|safe  %}active{% endif %}">
                            <th><a href="?mid={{ menu.pk }}">{{ menu.title }}</a></th>
                            <td><i class="fa {{ menu.icon }}" aria-hidden="true"></i></td>
                            <td>
                                <a style="color: #333333;" href="{% url ‘rbac:menu_edit‘ pk=menu.pk %}">
                                    <i class="fa fa-edit" aria-hidden="true"></i></a>
                                <a style="color: #d9534f;" href="{% url ‘rbac:menu_del‘ pk=menu.pk %}"><i
                                        class="fa fa-trash-o"></i></a>
                            </td>
                        </tr>

原 菜单列表,页面, menu_list.html

视图函数中:

def menu_list(request):
    ‘‘‘
    菜单和权限列表
    :param request:
    :return:
    ‘‘‘
    # menu_id = int(request.GET.get("mid"))  # 前端判断时,需要一个int类型,而不是str类型。
    menu_id = request.GET.get("mid")  # 或者在前端进行转换,将数字转换成,字符串
    menu_list = models.Menu.objects.all()
    return render(request, "rbac/menu_list.html", locals())

def menu_add(request):
    ‘‘‘
    添加页面
    :param request:
    :return:
    ‘‘‘
    if request.method == "POST":
        forms = MenuForm(request.POST)
        if forms.is_valid():
            forms.save()
            return redirect("rbac:menu_list")  # 这里需要做更改
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = MenuForm()
    return render(request, "rbac/change.html", {"forms": forms})

视图函数中,无需更改。  我需要做的就是,在模板中,生成url的时候,要做一些改动。
比如:
  我当前的菜单列表url                       http://127.0.0.1:8000/rbac/menu/list/?mid=1
  进入添加菜单url :  http://127.0.0.1:8000/rbac/menu/add/?_filter=mid%3D1
这就是我想要的效果:
  当前菜单列表,有 mid=1 的参数。 而我想做的就是,进入下一个页面的时候, 将mid=1 这个参数给携带上。
  但是又不能够直接就 拼接在后面, 因为如果我的添加页面,在提交数据的时候 也有一个参数是  mid=1 那么, 服务端  就不能够进行处理。
  所以, 我将 mid=1  进行转义打包成  _filter=mid%3D1。 单独使用一个变量来接收我想要的真实数据。

来看看如何实现:
  1.要想实现的话, 就要在服务端进行渲染页面时。 在对url 反向解析时,进行处理。
  原来我是使用    <a href="{% url  ‘rbac:menu_add‘ %}">添加菜单</a>。 这样的做法,只能够解析出这个url的地址,但  是却不能够, 携带上我的  mid=1  这个参数。
  他解析出来是  http://127.0.0.1:8000/rbac/menu/add/  这个样子的。
  但是我需要的是    http://127.0.0.1:8000/rbac/menu/add/?_filter=mid%3D1  这个样子的。
  2.  so 定义一个模板语法吧:
  这个模板语法需要的参数, 一定要 request  因为我需要从request对象中, 取得当前GET请求中携带的参数 mid=1。
  然后是  ‘rbac:menu_add‘  我需要这个名字,进行  reverse() 反向解析出。我要进入的这个url。 最后还有一点, 是针对   带有正则的  url  。 针对这种 url  在反向解析的时候, 必须要提供给reverse() 方法。这个参数。
  比如:re_path(r"^menu/edit/(?P<pk>\d+)/$", menu.menu_edit, name="menu_edit"),
  在反向解析的时候  就需要  reverse("rbac:menu_edit", 12)  后面根的是什么,取决于正则是怎么写的。
  然后有一点要注意的是, 如果是 /(?P<pk>\d+)/ 这就是有名分组, 传参数时就是, 关键字传参。
  如果是 /(\d+)/ 这就是无名分组, 传参数时就是, 位置参数传参。
基于以上的理由,进行, 这个自定义模板的编写:

def memory_url(request, name, *args, **kwargs):
    ‘‘‘
    生成带有原搜索条件的url  (?mid=1&age=20)  (替代原模板中的url)
    :param request:  # 从request中获取,当前请求的所有参数
    :param name:  # 帮助反向解析,生成url  ‘rbac:menu_list‘
    :return:
    ‘‘‘
    basic_url = reverse(name, args=args, kwargs=kwargs)
    # basic_url = reverse(name, kwargs="", args="")
    # reverse中使用kwargs传参,或者使用args传参, 取决于在url路由分发的阶段, 正则表达式 是关键字传参还是位置传参

    # 当前GET请求的url中无参数,携带。直接返回 反向解析的,地址
    if not request.GET:
        return basic_url
    # 当前GET请求的url中有参数,携带。 那么就需要将,这次请求的url 中的参数。进行打包,传给下一次的url
    query_dict = QueryDict(mutable=True)  # 使用django自带的Query_Dict 进行参数的打包。
    query_dict["_filter"] = request.GET.urlencode()  # 获取到本次GET请求携带的数据mid=2 。 并交给QueryDict进行转义打包
    # query_dict.urlencode()  # 这里就会使自动转义之后的字符串 _filter=mid%3D1
    return "%s?%s" % (basic_url, query_dict.urlencode())

reverse(name, args=args, kwargs=kwargs) 先对,基础的路由地址url 进行解析。

判断,当前请求中, 是否有参数携带。    request.GET 如果是 None 的话, 就说明没有参数携带, 也就不需要进行把参数携带到下一个路由当中了。

使用Django自带的QueryDict, 来打包我们的参数。 理由上述已经讲过。
如果有参数携带的话, 最终返回的, 就是携带了参数的  一条完整的 url

模板中的使用:

                <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>

模板中需要填入的参数,只有 request  和  ‘rbac:menu_add‘  。
需要注意的是, 因为是位置传参, 这两个顺序是不能错的!

menu_list.html

然后最后一个问题了:
我已经将,参数进行处理之后,携带这本次的  mid=1 进入到了。下一次的url中。
那么, 往回跳转的时候呢?
看代码:

def memory_reverse(request, name, *args, **kwargs):
    ‘‘‘
    反向生成url。
        1.在url获取原来的搜索条件, 如_filter之后的值
        2.reverse反向解析原来的url 如:/menu/list/
        3.进行拼接:/menu/list/?_filter=mid%3D2
    示例:
        http://127.0.0.1:8000/rbac/menu/add/?_filter=mid%3D2
    解析之后:
        http://127.0.0.1:8000/rbac/menu/list/?mid=2
    :param request:
    :param name:   # url的别名
    :param args:   # url中正则分组的位置参数
    :param kwargs: #url中正则分组的关键字参数
    :return:
    ‘‘‘
    url = reverse(name, args=args, kwargs=kwargs)
    origin_params = request.GET.get("_filter")
    if origin_params:
        url = "%s?%s" % (url, origin_params)
    return url

我们知道,在视图中跳转使用的是: redirect()
比如  我在添加成功菜单成功之后的 视图函数是这样写的:

def menu_add(request):
    ‘‘‘
    添加页面
    :param request:
    :return:
    ‘‘‘
    if request.method == "POST":
        forms = MenuForm(request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(reverse("rbac:menu_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = MenuForm()
    return render(request, "rbac/change.html", {"forms": forms})

看代码,可以看出。 也没什么不对。  但是如果单纯的这样写, 我自己的反向解析函数 momory_reverse() 不就白写了嘛!
而且最重要的, 我想要的  ../?_filter=mid%3D1  这个 问号,后面的参数, 没有给我带过来。
so:还是,使用。我的这个反向解析函数:

def menu_add(request):
    ‘‘‘
    添加页面
    :param request:
    :return:
    ‘‘‘
    if request.method == "POST":
        forms = MenuForm(request.POST)
        if forms.is_valid():
            forms.save()
            return redirect(memory_reverse(request, "rbac:menu_list"))
        else:
            return render(request, "rbac/change.html", {"forms": forms})
    forms = MenuForm()
    return render(request, "rbac/change.html", {"forms": forms})

让,我跳转向的, menu_list  的url  能够携带上。 进入添加页面之前时,我在 menu_list 页面 url中所有的 mid=1 这个参数。

可能有些,难以理解。 不过举个例子就是:
  我在 菜单列表页面时,我的参数中有一个 mid=1
  然后 你带着这个 mid=1 到添加页面,逛了一圈。
  然后回来的时候, 你得把这个 mid=1 这个参数,还给我,    不能直接扔了。

  

原文地址:https://www.cnblogs.com/chengege/p/10710371.html

时间: 2024-08-21 05:39:19

权限分配之一级菜单保留原搜索条件的相关文章

权限组件(8):一级菜单的展示、增删改查和保留原参数

效果图: 一.路由配置 rbac/urls.py from django.urls import re_path from rbac.views import menu urlpatterns = [ ... # 菜单管理 re_path(r'^menu/list/$', menu.menu_list, name='menu_list'), re_path(r'^menu/add/$', menu.menu_add, name='menu_add'), re_path(r'^menu/edit/

权限管理的三级菜单的流程及使用流程

权限管理的三级菜单的流程 权限控制 url代表了权限 表结构(6张表,ORM创建4个类,两个many2many会自动再生成两张表) 用户表 用户名 密码 多对多 roles(角色)角色表 标题 title 多对多 permission(权限)权限表 标题 title 权限 url URL别名 name   - 设置唯一(方便为了将权限粒度控制到按钮级别) 外键 menu(菜单) 外键 permission(self自己)菜单表 标题 title 图标 icon 权重 weight用户和角色关系表

jquery easy ui 1.5最新版本 简单的权限分配

jquery easy 1.5 Maven+servlet+jsp+jdbc实现权限管理分配 首先,我先说明下,我只是一个菜鸟,我只是在编程道路上摸索的一个的小码农.做开发三年了,这好像是我第一次写博客.以前接触过类似于jquery easy  ui 的DWZ,是我第一家公司用的UI框架.所以用easy ui感觉很快能上手.都是基于jquery 的ui框架.好,废话少说.此次项目我是用最基础的jsp+servlet+jdbc写的,同时加入了maven管理jar包以及发布.应该很好理解的. 1.准

环境企业表单权限分配填报数据系统设计与实现

本科生毕业论文(设计) Undergraduate Graduation Thesis(Design) 题目Title:环境企业表单权限分配填报数据   系统设计与实现                 院 系 School (Department):数据科学与计算机学院  专 业 Major:   软件工程   学生姓名 Student Name:                     学 号 Student No.:                    指导教师(职称) Superviso

Mysql用户密码设置修改和权限分配

我的mysql安装在c:\mysql 一.更改密码 第一种方式: 1.更改之前root没有密码的情况 c:\mysql\bin>mysqladmin -u root password "your password" 2.更改之前root有密码的情况,假如为123456 c:\mysql\bin>mysqladmin -u root -p123456 password "your password" 注意:更改的密码不能用单引号,可用双引号或不用引号 第二

linux 用户创建、管理、权限分配

(1)su与sudo su:通过su可以在用户之间切换,如果超级权限用户root向普通或虚拟用户切换不需要密码,什么是权力?这就是!而普通用户切换到其它任何用户都需要密码验证: sudo: sudo扮演的角色注定了它要在安全方面格外谨慎,否则就会导致非法用户攫取root权限.同时,它还要兼顾易用性,让系统管理员能够更有效,更方便地使用它. # 1. sudo能够限制指定用户在指定主机上运行某些命令.# 2. sudo可以提供日志,忠实地记录每个用户使用sudo做了些什么,并且能将日志传到中心主机

设计OA系统的用户-角色-权限分配

转载:http://www.cnblogs.com/jsping/archive/2013/01/23/2872972.html 设计OA系统的用户-角色-权限分配 一,前言  本文主要讲述在OA系统设计时用户——角色——权限的数据库设计,以便实现权限分配. 二,初步分析 用户通过UI登录系统时,把用户的用户名.密码传递给后台判断用户表中是否存在可用的用户信息,如果存在那么允许页面的跳转,并设置一些Session信息,当页面跳转时根据用户的Session信息获取用户的角色,进一步根据角色获取用户

根据权限动态生成二级菜单

数据库models设计: from django.db import models """ 一级菜单 """ class Menu(models.Model): title = models.CharField(max_length=32, unique=True) icon = models.CharField(max_length=32, verbose_name="图标", null=True, blank=True)

rbac 权限分配, 基于formset实现,批量编辑

已经完成了  批量添加的功能. 还想要一个批量修改的功能了.随之而来的第一个问题就是,  我们的formset 并不是一条记录.而是 多条记录,甚至整个表的记录.那么显而易见的问题就是,当前端页面把数据,返回给服务端的时候.  我怎么就知道,这条数据,是对应的数据库的那一条记录呢?毕竟  不管是  title. url. name. menu_id. pid_id  都无法保证我去数据库中,找到与之相对应的这条记录. 所以我们就只能再加上一个字段,就是每一条数据的 主键 id 字段.所以,我的f