首先需要知道的一个知识点:
1、request.GET是一个QueryDict类型的,要想取出?后面的结构就用request.GET.urlencode()
2、request.GET默认是不可修改的,需要把params = QueryDict(mutable=True) ,mutable这个参数设置成True
这样就可以修改了。就可以设置值了。
print(type(request.GET)) #<class 'django.http.request.QueryDict'>
from django.http import QueryDict
二、编辑后保留原URl搜索条件
实现方式一:
在列表页面: 获取当前所有条件,添加到 - 编辑按钮的URL后面 - 添加按钮的URL后面 编辑或添加页面: - POST提交时,获取原来列表页面传过来的条件 - 拼接URL /hosts/?原来的条件 list页面: views.py list_condition = request.GET.urlencode() #获取当前所有条件 host.html {% for item in host_list %} <li>{{ item }} <a href="/edit/54/?{{ list_condition }}">编辑</a></li> {% endfor %} add/edit页面:http://127.0.0.1:8000/edit/10/?page=5&id__gt=4 def edit_host(request,pk): if request.method == "GET": return render(request,'edit_host.html') else: # 修改成功 /hosts/?page=5&id__gt=4 url = "/hosts/?%s" %(request.GET.urlencode()) return redirect(url)
方式一的不足:
url上可能会有自己的参数,还有列表页面传进来的参数。所以我们要是自己用自己的
要把他们区分开来:那些是编辑页面的参数,那些事列表页面的参数。那么怎么区分呢?
借鉴django源码,吧他们打包成一个字符串,假设叫_list_filter=page=15$id_gt=11$p=666
目标:吧原来的参数打包成一个值,赋值给字典的key
这就引进了第二种方式
实现方式二:
list页面:url格式 http://127.0.0.1:8000/hosts/?page=5&id__gt=4 views.py
def host(request):
params = QueryDict(mutable=True) #创建对象, params['_list_filter'] = request.GET.urlencode() #设置值 :吧当前url作为值赋值给_list_filter list_condition = params.urlencode() host.html {% for item in host_list %} <li>{{ item }} <a href="/edit/54/?{{ list_condition }}">编辑</a></li> {% endfor %} add/edit页面 url格式http://127.0.0.1:8000/edit/54/?_list_filter=page%3D5%26id__gt%3D4 def edit_host(request,pk): if request.method == "GET": return render(request,'edit_host.html') else: # 修改成功 /hosts/?page=5&id__gt=4 url = "/hosts/?%s" %(request.GET.get('_list_filter')) #获取_list_filter值 return redirect(url)