保留原搜索條件的整體思路是在展現頁面中,獲取去url中的相關搜索條件參數,將此參數保留存放在頁面中如編輯或者刪除按鈕的連接路徑中,實現編輯或者刪除後,視圖再次得到url以前保存的頁面搜索相關參數,與重定向url拼接後 ,便可實現原路返回原頁面位置。html
具體介紹以下:django
''' 實現方式一: 列表頁面: 獲取當前全部條件,添加到 - 編輯按鈕的URL後面 - 添加按鈕的URL後面 編輯或添加頁面: - POST提交時,獲取原來列表頁面傳過來的條件 - 拼接URL /hosts/?原來的條件 list頁面: list_condition = request.GET.urlencode() {% for item in host_list %} <li>{{ item }} <a href="/edit/{{id}}/?{{ 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) 實現方式二:(更安全) list頁面: http://127.0.0.1:8000/hosts/?page=5&id__gt=4 params = QueryDict(mutable=True) params['_list_filter'] = request.GET.urlencode() list_condition = params.urlencode() {% 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/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')) return redirect(url) '''
說明:如請求路徑爲http://127.0.0.1:8000/hosts/?page=5&id__gt=4,request.GET.urlencode()得到請求路徑中的總體條件page=5&id__gt=4,request.GET結果是QueryDict數據類型,默認QueryDict數據類型不可編輯,可是如(params = QueryDict(mutable=True))設置mutable=True,QueryDict數據類型將變得可編輯。分以下兩種狀況:安全
#一、已有QueryDict設置: request.GET #(QueryDict對象) request.GET._mutable = True
#二、新建QueryDict設置: params = QueryDict(mutable=True)
應用實例:app
渲染頁面編輯按鈕函數:
from django.http import QueryDict def edit(self,obj=None,is_header=False): if is_header: return '編輯' query_str = self.request.GET.urlencode() # page=2&nid=1 if query_str: params = QueryDict(mutable=True) params[self._query_param_key] = query_str return mark_safe('<a href="%s?%s">編輯</a>' %(self.get_change_url(obj.id),params.urlencode(),)) # /stark/app01/userinfo/ return mark_safe('<a href="%s">編輯</a>' % (self.get_change_url(obj.id),)) # /stark/app01/userinfo/
處理編輯頁面的視圖函數:函數
def change_view(self,request,nid,*args,**kwargs): # self.model_class.objects.filter(id=nid) obj = self.model_class.objects.filter(pk=nid).first() if not obj: return redirect(self.get_list_url()) model_form_class = self.get_model_form_class() # GET,顯示標籤+默認值 if request.method == 'GET': form = model_form_class(instance=obj) return render(request,'stark/change_view.html',{'form':form}) else: form = model_form_class(instance=obj,data=request.POST) if form.is_valid(): form.save() list_query_str = request.GET.get(self._query_param_key) list_url = "%s?%s" %(self.get_list_url(),list_query_str,) return redirect(list_url) return render(request, 'stark/change_view.html', {'form': form})