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

 

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

 

一、 Paginator

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

 

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

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

二、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>

 

 

四、效果

   

 

posted @ 2020-06-29 10:28  语~默  阅读(540)  评论(0编辑  收藏  举报