Fork me on GitHub

编辑后保留原URl搜索条件

首先需要知道的一个知识点:

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)

 

posted on 2017-08-06 13:51  vmaze  阅读(175)  评论(0编辑  收藏  举报

导航