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%3D8param = 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=8def 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>

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

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)

浙公网安备 33010602011771号