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})
分类:
06-web框架开发
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)