Django 实现分页功能(django 2.2.7 python 3.7.5 )

 

Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能。本文就讲解如何使用 Paginator 实现分页功能。

 

1|0一、 Paginator

Paginator 类的作用是将我们需要分页的数据分割成若干份。当我们实现化一个 Paginator 类的实例时,需要给 Paginator 传入两个参数。第一个参数是数据源,可以是一个列表、元组、以及查询结果集 QuerySet。第二个参数需要传入一个整数,表示每页显示数据条数。具体写法如下:

 

Paginator 类中有三个常用的属性,它们分别是:

  • count:表示所有页面的对象总数。
  • num_pages: 表示页面总数。
  • page_range: 下标从 1 开始的页数范围迭代器。

2|0二、Page 对象

Paginator 类提供一个** page(number) **函数,该函数返回就是一个 Page 对象。参数 number 表示第几个分页。如果 number = 1,那么 page() 返回的对象是第一分页的 Page 对象。在前端页面中显示数据,我们主要的操作都是基于 Page 对象。具体用法如下:

1
2
# 使用  paginator 对象返回第 1 页的 page 对象
logs= paginator.page(1)

Page 对象有三个常用的属性:

  • object_list: 表示当前页面上所有对象的列表。
  • numberv: 表示当前页的序号,从 1 开始计数。
  • paginator: 当前 Page 对象所属的 Paginator 对象。 

Page 对象还拥有几个常用的函数:

  • has_next(): 判断是否还有下一页,有的话返回True。
  • has_previous():判断是否还有上一页,有的话返回 True。
  • has_other_pages():判断是否上一页或下一页,有的话返回True。
  • next_page_number(): 返回下一页的页码。如果下一页不存在,抛出InvalidPage 异常。
  • previous_page_number():返回上一页的页码。如果上一页不存在,抛出InvalidPage 异常。

 

三、代码展示

  一、views

 

1 from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage #导入分页功能 2 3 #分页代码 4 def cut_page(request,db_list,page_total): #需要三个参数:网页的request请求、 数据库返回值、每页条目数 5 paginator = Paginator(db_list, page_total) 6 # 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1 7 page = request.GET.get('page') 8 try: 9 db_list = paginator.page(page) 10 # todo: 注意捕获异常 11 except PageNotAnInteger: 12 # 如果请求的页数不是整数, 返回第一页。 13 db_list = paginator.page(1) 14 except InvalidPage: 15 # 如果请求的页数不存在, 重定向页面 16 return HttpResponse('找不到页面的内容') 17 except EmptyPage: 18 # 如果请求的页数不在合法的页数范围内,返回结果的最后一页。 19 db_list = paginator.page(paginator.num_pages) 20 return db_list 21 22 23 #具体调用 24 def sw_br(request): 25 sw_lists = models.sw_br.objects.all().order_by('sw_addr') #查询数据库数据 26 sw_lists = cut_page(request,sw_lists,11) #调用 27 return render(request,'sw_mgmt/b_r.html',{'sw_lists':sw_lists})

 

 

 

 

  二、HTML    

  <!-- Bootstrap core CSS -->
  <link rel="stylesheet" href="/static/openvpn/css/bootstrap.min.css"/>

 

1 <div class="table-responsive"> 2 <table class="table table-hover"> 3 <thead class="thead-light"> 4 <tr> 5 {{ del_users_msg }} 6 <th scope="col" >ID</th> 7 <th scope="col" >品牌</th> 8 <th scope="col" >型号</th> 9 <th scope="col" >功能</th> 10 </tr> 11 </thead> 12 <tbody ckass="no-underline"> 13 {% for item in sw_lists %} 14 <tr> 15 <th scope="row">{{ forloop.counter }}</th> 16 <td>{{ item.get_brand_display }}</td> 17 <td>{{ item.sw_model }}</td> 18 <td>{{ item.get_gn_display }}</td> 19 </tr> 20 {% endfor %} 21 </tbody> 22 </table> 23 {# 实现分页标签的代码 #} 24 {# 这里使用 bootstrap 渲染页面 #} 25 <div id="pages" class="text-center" > 26 <nav> 27 <ul class="pagination"> 28 <li>共{{ sw_lists.paginator.num_pages }}页</li> {# 注意此处的sw_lists(以及后边的) 为后台传出的,需要更具自己的页面进行就该 #} 29 <li>&nbsp; &nbsp; &nbsp; </li> 30 <li class="step-links"> 31 {% if sw_lists.has_previous %} 32 <a class='active' href="?page=1">首页</a> 33 <a class='active' href="?page={{ sw_lists.previous_page_number }}">上一页</a> 34 {% endif %} 35 36 <span class="current"> 37 第 {{ sw_lists.number }} 页</span> 38 39 {% if sw_lists.has_next %} 40 <a class='active' href="?page={{ sw_lists.paginator.num_pages }}">末页</a> 41 <a class='active' href="?page={{ sw_lists.next_page_number }}">下一页</a> 42 {% endif %} 43 </li> 44 <li>&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</li> 45 </ul> 46 </nav> 47 </div> 48 </div>

 

 

四、效果

   

 


__EOF__

本文作者语 默
本文链接https://www.cnblogs.com/weijie0717/p/13206519.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   语~默  阅读(543)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示