本人另外有一篇文档是专门更新Django的一些操作笔记,有需要可以收藏关注一下:Django笔记

目录

  • 具体实现如下:
  • 效果展示

分页器参考:Django高级之-分页器
场景:在对查询列表进行搜索、排序时,新手往往会遇到翻页后条件丢失的情况。一般的做法是将搜索条件传递到前端页面,然后将翻页链接写为:

<a href="?keywords={{keywords}}&page_num={{ goods.next_page_number }}">下一页</a>
# views.py# 关键词查询
def allgoods(request):goods = Goods.objects.all()keywords = request.GET.get("keywords","")if keywords:goods = goods.filter(goodsName__icontains=keywords)context={"goods":goods,"keywords":keywords,}return render(request, 'allgoods.html', context)# allgoods.html<form action="{% url 'allgoods' %}" method="get"><input type="text" name="keywords" value="{{keywords}}"><button type="submit">查询</button>
</form>
<table><tr><th>商品名</th><th>价格</th></tr>{% for g in goods%}<tr><td>{{g.goodsName}}</td><td>{{g.price}}</td></tr>{% endfor %}
</table><ul><!-- 上一页 -->{% if goods.has_previous %}<a href="?keywords={{keywords}}&page_num={{ goods.previous_page_number }}">上一页</a>{% endif %}<!-- 根据页码跳转 -->{% for p in page_range %}{% if page_num == p %}<a href="?keywords={{keywords}}&page_num={{p}}">{{p}}</a>{% else %}<a href="?keywords={{keywords}}&page_num={{p}}">{{p}}</a>{% endif %}{% endfor %}<!-- 下一页 -->{% if goods.has_next %}<a href="?keywords={{keywords}}&page_num={{ goods.next_page_number }}">下一页</a>{% endif %}
</ul>

但是这个方法的可扩展性不是很好,比如我们要追加一个排序条件时,就需要修改前端的超链接,如:

<!-- {{orderby}} == goodsName / -goodsName / price / -price -->
<a href="?keywords={{keywords}}&orderby={{orderby}}&page_num={{ goods.next_page_number }}">下一页</a>

而且在没有筛选条件时,浏览器的超链接会多显示出一个筛选条件,如:

这里向大家提供了一个优雅地保存筛选条件的方法。可以不用修改前端翻页url链接即可实现对多个筛选条件的追加

<a href="?{{mywhere|join:'&'}}&page_num={{ goods.next_page_number }}">下一页</a>

具体实现如下:

其中的关键操作是views.py中的mywhere列表和html文件中的字符串拼接操作

# urls.py
urlpatterns=[path("allgoods", views.allgoods, name="allgoods"), # 所有商品页面
]# views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from testApp.models import Goodsdef allgoods(request):    mywhere = []# 获取商品列表goods = Goods.objects.all()# 关键词查询keywords = request.GET.get("keywords","")if keywords:goods = goods.filter(goodsName__icontains=keywords)mywhere.append("keywords="+keywords)# 条件排序orderby = request.GET.get("orderby","")if orderby:goods = goods.order_by(orderby)        mywhere.append("orderby="+orderby)# 进行分页paginator = Paginator(goods, 10) # 每页10条page_num = request.GET.get('page_num',1) # 获取当前页数,没有则默认为1try:goods = paginator.page(page_num) # goods 为Page对象!except PageNotAnInteger:# If page is not an integer, deliver first page.goods = paginator.page(1)except EmptyPage:# If page is out of range (e.g. 9999), deliver last page of results.goods = paginator.page(paginator.num_pages)if paginator.num_pages > 11:# 1、当前的页数小于6时,直接使用1到11区间的页面if page_num-5 < 1:page_range = range(1, 12)# 2、当当前的页面数+5大于总页数的话,直接显示最后的11个数elif page_num + 5 > paginator.num_pages:page_range = range(paginator.num_pages - 11, paginator.num_pages + 1)# 3、按照范围取值else:page_range = range(page_num - 5, page_num + 6)else:# 4、当前的页面有多少页显示多少页page_range = paginator.page_range# 最后一页page_last = paginator.num_pagescontext={"goods": goods,"page_range":page_range,"page_last":page_last,"mywhere": mywhere,}print("mywhere:",mywhere)return render(request, "goodsList.html",context)# goodsList.html<form action="{% url 'allgoods' %}" method="get"><input type="text" name="keywords" value="{{keywords}}"><button type="submit">查询</button>
</form>
<a href="?{{mywhere|join:'&'}}&orderby=goodsName">商品名升序</a>
<a href="?{{mywhere|join:'&'}}&orderby=-goodsName">商品名降序</a>
<a href="?{{mywhere|join:'&'}}&orderby=price">价格升序</a>
<a href="?{{mywhere|join:'&'}}&orderby=-price">价格降序</a><table><tr><th>商品名</th><th>价格</th></tr>{% for g in goods%}<tr><td>{{g.goodsName}}</td><td>{{g.price}}</td></tr>{% endfor %}
</table><ul class="pagination"><!-- 上一页 -->{% if goods.has_previous %}<a href="?{{mywhere|join:'&'}}&page_num={{ goods.previous_page_number }}">上一页</a>{% endif %}<!-- 根据页码跳转 -->{% for p in page_range %}{% if page_num == p %}<a href="?{{mywhere|join:'&'}}&page_num={{p}}">{{p}}</a>{% else %}<a href="?{{mywhere|join:'&'}}&page_num={{p}}">{{p}}</a>{% endif %}{% endfor %}<!-- 下一页 -->{% if goods.has_next %}<a href="?{{mywhere|join:'&'}}&page_num={{ goods.next_page_number }}">下一页</a>{% endif %}
</ul>

效果展示

1.首次进入列表页面时,可以看到顶部地址为localhost:8002/allgoods
最下方下一页地址预览为:localhost:8002/allgoods?&page_num=2
没有多余的筛选条件

2.在查找商品名中含有“1”的商品时:
在第一页只有搜索关键词,翻页后则追加了一个页面编码

翻页后:
3.多个筛选条件(追加排序)
可以看到,对搜索商品名中含有“1”的商品列表按照价格降序后的url地址为http://localhost:8002/allgoods?keywords=1&orderby=-price
下一页的url预览为http://localhost:8002/allgoods?keywords=1&orderby=-price&page_num=2

Django 实现搜索结果分页(筛选结果分页),以及优雅添加多个筛选条件相关推荐

  1. 第三百八十九节,Django+Xadmin打造上线标准的在线教育平台—列表筛选结合分页...

    第三百八十九节,Django+Xadmin打造上线标准的在线教育平台-列表筛选结合分页 根据用户的筛选条件来结合分页 实现原理就是,当用户点击一个筛选条件时,通过get请求方式传参将筛选的id或者值, ...

  2. EntityFramework_MVC4中EF5 新手入门教程之三 ---3.排序、 筛选和分页

    在前面的教程你实施了一套基本的 CRUD 操作,为Student实体的 web 页.在本教程中,您将添加排序. 筛选和分页到 StudentsIndex的功能.您还将创建一个页面,并简单分组. 下面的 ...

  3. Django Rest Framework源码剖析(七)-----分页

    一.简介 分页对于大多数网站来说是必不可少的,那你使用restful架构时候,你可以从后台获取数据,在前端利用利用框架或自定义分页,这是一种解决方案.当然django rest framework提供 ...

  4. 【Sharepoint】使用SharePoint rest api对list中的数据进行获取、排序、筛选、分页操作

    获取数据 1.获取所有数据(所有字段) https://weburl/_api/web/lists/getbytitle('infolist')/items 2.获取指定字段 可以通过select来指 ...

  5. html layui分页代码,layUI分页处理--乐字节前端

    分页 ​ 模块加载名称:laypage 快速使用 ​ laypage 的使用非常简单,指向一个用于存放分页的容器,通过服务端得到一些初始值,即可完成分页渲染. 分页 layui.use('laypag ...

  6. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  7. php分页3 1,经典php分页代码与分页原理(1/3)

    经典php教程分页代码与分页原理 1.前言 分页显示是一种非常常见的浏览和显示大量数据的方法,属于web编程中最常处理的事件之一.对于web编程的老手来说,编写这种代码实在是和呼吸一样自然,但是对于初 ...

  8. Vue3 element-ui实现Pagination分页组件--封装分页

    什么是Pagination分页组件? 在 B 端的 web 开发中,分页组件或者叫分页器,是较为常用的控件之一,通常配合表格或列表,实现数据量大的情况下,分页拆解数据的功能. 1.scrollTo和滚 ...

  9. WIndows内核学习笔记:分页机制——PAE分页模式

    目录 前言 Chapter 4 Paging 4.1 分页模式和控制位 4.1.1 四种分页模式 4.1.2 启用和切换分页模式 4.1.3 分页属性控制 4.1.4 Enumeration of P ...

最新文章

  1. ASSERT(IsOpen());
  2. Linux下命令行ssh密钥连接服务器
  3. 解决 IntelliJ IDEA 中 .propertise 文件保存后中文乱码
  4. Orchard学习笔记四:启用用户注册
  5. 【数据结构】普通二叉树的实现
  6. 2020年8月小程序互联网发展研究报告
  7. c语言格式化知识点(sscanf)
  8. shell脚本中的逻辑判断、文件目录属性判断、if特殊用法、case判断
  9. 三星s8android8.0,三星S8国行升级安卓8.0 系统流畅度提升
  10. SaaS前世今生:老树开新花
  11. 关于跳转页面报404、500错误设置自定义图片和文字
  12. 苹果手机语音备忘录在哪_苹果手机备忘录被家里宝宝误删了如何恢复呢?
  13. Word如何快速设置多级标题并生成目录
  14. Macbook Pro 鼠标卡顿问题
  15. EVE-NG模拟器简述
  16. Ardupilot-链接汇总
  17. PS磨皮滤镜Portraiture2.3简体中文绿色版32b/64b
  18. 并查集 浙师大oj1212
  19. 美国在线地图软件测评:谷歌居首必应次之
  20. 是谁在偷窥你的手机隐私?

热门文章

  1. RuntimeError: a view of a leaf Variable that requires grad is being used in an in-place operation.
  2. 第五章 ERP计划的时间概念
  3. bmob项目php后端,bmob开发文档-Bmob移动后端云服务平台
  4. 基于QT(c++)的家庭财务管理系统
  5. RSA/ECDSA host key has changed 错误
  6. linux系统中ssh命令,Linux系统中SSH 命令的用法有哪些?
  7. ffmpeg音频滤镜
  8. 高德地图看各省分界线_高德地图定位城市区域
  9. Api升级28适配填坑(一)
  10. GE凝胶成像 AI600