• django 保留原搜索页面条件url


    django 保留原搜索页面条件url

    保留原搜索条件的总体思路是在展示页面中,获取去url中的相关搜索条件参数,将此参数保留存放在页面中如编辑或者删除按钮的链接路径中,实现编辑或者删除后,视图再次获得url之前保存的页面搜索相关参数,与重定向url拼接后 ,即可实现原路返回原页面位置。

    具体介绍如下:

    '''
    实现方式一:
        列表页面:
            获取当前所有条件,添加到 
                - 编辑按钮的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数据类型将变得可编辑。分如下两种情况:

    #1、已有QueryDict设置:
    request.GET                                                        #(QueryDict对象)
    request.GET._mutable = True
    #2、新建QueryDict设置:
    params = QueryDict(mutable=True)
    

    应用实例:

     渲染页面编辑按钮函数:
    
      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})
    
  • 相关阅读:
    sql语句的优化分析
    log4net.config
    redis lua 脚本实例
    Lua 脚本
    ServiceStack.Redis之IRedisClient<第三篇>
    有关Redis的Add和Set方法的比较
    如何在自己网站加上视频直播功能(搭建视频直播网站)
    带进度条的上传插件
    YII获取当前URL
    MYSQL常用命令
  • 原文地址:https://www.cnblogs.com/hanfe1/p/13384555.html
Copyright © 2020-2023  润新知