python之路_保留原搜索頁面條件

  保留原搜索條件的整體思路是在展現頁面中,獲取去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})
相關文章
相關標籤/搜索