13 Django-url跳转携带条件

解释:
http://127.0.0.1:8000/customer/list/?filter=lxx&age=19

request.GET 对象,本质是QueryDict类型

1.默认QueryDict不允许被修改 _mutable = False
request.GET._mutable = True # 可以被修改了

2.设置值
request.GET.setlist("name", [123]) # filter=lxx&age=18&name=123
request.GET.setlist("name", [123, 321]) # filter=lxx&age=18&name=123&name=321

3.参数拼接成字符串,调用urlencode方法:
paramString = request.GET.urlencode()
print(paramString) # "filter=lxx&age=18&name=123"

-----测试-----

http://127.0.0.1:8000/customer/list/?filter=lxx&age=19

def customer_list(request):
    print(request.GET)
    print(request.GET.urlencode())
    request.GET._mutable = True
    request.GET.setlist('name', [123])
    print(request.GET)
    print(request.GET.urlencode())

"""
<QueryDict: {'filter': ['lxx'], 'age': ['19']}>
filter=lxx&age=19
<QueryDict: {'filter': ['lxx'], 'age': ['19'], 'name': [123]}>
filter=lxx&age=19&name=123
"""

在生成URL时,需要读取当前URL中的参数并构造URL。例如:

  • 导入模块

    from django.http import QueryDict
    
  • 当前URL

    http://127.0.0.1:8000/customer/list/?keyword=xinchen&page=8
    
  • 构造编辑页面URL

    http://127.0.0.1:8000/customer/edit/1/?_filter=keyword%3Dxinchen%26page%3D8
    
    param = request.GET.urlencode() # 获取?后面的值
    
    new_query_dict = QueryDict(mutable=True)  # 创建一个对象,设置可修改
    new_query_dict['_filter'] = param
    
    new_query_dict.urlencode()  # 内部自动实现转义
    
  • 跳转回来时

    http://127.0.0.1:8000/customer/list/?keyword=xinchen&page=8
    
    def policy_edit(request, pk):
        ...
        base_url = reverse(name, args=args, kwargs=kwargs)
        param_url = request.GET.get('_filter')
        url = "{}?{}".format(base_url,param_url)
        return redirect(url)
    

实操分享

模板按钮:

{% load rbac %}

<a href="{% memory_url request "rbac:menu_add" %}" class="right btn btn-success btn-xs">新建</a>
<a style="color: #333333;" href="{% memory_url request "rbac:menu_edit" pk=row.id %}">编辑</a>
<a style="color: #d9534f;" href="{% memory_url request "rbac:menu_del" pk=row.id %}">删除</a>

image

rbac.py

from django.template import Library
from django.urls import reverse
from django.http import QueryDict

register = Library()

@register.simple_tag()
def memory_url(request, name, *args, **kwargs):
    """生成带有原搜索条件的url,替代了模板中的url"""
    basic_url = reverse(name, args=args, kwargs=kwargs)
    if not request.GET:
        return basic_url

    query_dict = QueryDict(mutable=True)  # 可修改
    query_dict["_filter"] = request.GET.urlencode()  # mid=1&age=2

    return "{}?{}".format(basic_url, query_dict.urlencode())  # /menu/list/?_filter=mid%3D1

image

menu.py
from django.shortcuts import render, redirect, HttpResponse
from django.urls import reverse

from rbac import models
from rbac.forms.menu import MenuModelForm


def menu_list(request):
    """菜单和权限列表"""
    menus = models.Menu.objects.all()
    menu_id = request.GET.get("mid")

    menu_dict = {
        "menus": menus,
        "menu_id": menu_id,
    }
    return render(request, "rbac/menu_list.html", menu_dict)


def menu_add(request):
    if request.method == 'GET':
        form = MenuModelForm()
        return render(request, 'rbac/change.html', {'form': form})

    form = MenuModelForm(data=request.POST)
    if form.is_valid():
        form.save()
        url = reverse("rbac:menu_list")
        origin_params = request.GET.get("_filter")
        if origin_params:
            url = "{}?{}".format(url, origin_params)
        return redirect(url)

    return render(request, 'rbac/change.html', {'form': form})


def menu_edit(request, pk):
    obj = models.Menu.objects.filter(id=pk).first()
    if not obj:
        return HttpResponse('菜单不存在')
    if request.method == 'GET':
        form = MenuModelForm(instance=obj)
        return render(request, 'rbac/change.html', {'form': form})

    form = MenuModelForm(instance=obj, data=request.POST)
    if form.is_valid():
        form.save()
        url = reverse("rbac:menu_list")
        origin_params = request.GET.get("_filter")
        if origin_params:
            url = "{}?{}".format(url, origin_params)
        return redirect(url)

    return render(request, 'rbac/change.html', {'form': form})


def menu_del(request, pk):
    url = reverse("rbac:menu_list")
    origin_params = request.GET.get("_filter")
    if origin_params:
        url = "{}?{}".format(url, origin_params)

    if request.method == 'GET':
        return render(request, 'rbac/delete.html', {'cancel': url})

    models.Menu.objects.filter(id=pk).delete()
    return redirect(url)

posted @ 2022-08-15 14:54  角角边  Views(88)  Comments(0)    收藏  举报