Django提供了一个新的类来帮助你管理分页数据,.它可以接收列表、元组或其它可迭代的对象。
一:常用方法
>>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george', 'ringo'] >>> p = Paginator(objects, 2) >>> p.count 4 >>> p.num_pages 2 >>> type(p.page_range) <class 'range_iterator'> >>> p.page_range range(1, 3) >>> page1 = p.page(1) >>> page1 <Page 1 of 2> >>> page1.object_list ['john', 'paul'] >>> page2 = p.page(2) >>> page2.object_list ['george', 'ringo'] >>> page2.has_next() False >>> page2.has_previous() True >>> page2.has_other_pages() True >>> page2.next_page_number() Traceback (most recent call last): ... EmptyPage: That page contains no results >>> page2.previous_page_number() 1 >>> page2.start_index() # The 1-based index of the first item on this page 3 >>> page2.end_index() # The 1-based index of the last item on this page 4 >>> p.page(0) Traceback (most recent call last): ... EmptyPage: That page number is less than 1 >>> p.page(3) Traceback (most recent call last): ... EmptyPage: That page contains no results
二:定义工具
定义工具,可供多个页面使用。
效果如下:
1)定义方法:pages.py
# -*- coding:utf-8 -*- __author__ = 'lixiang' from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def page(request,post_objects,page_number=20): """ 实现分页 :param request: view中request :param post_objects: 需要实现分页的对象(列表,queryset) :param page_number: #每页显示条数,默认20页 :return: """ #实例化结果集, queryset转列表 post_objects=list(post_objects) paginator = Paginator(post_objects, page_number) # Show 20 contacts per page #获取htmml中传递page值 page = request.GET.get('page',1) try: #需要返回的值 page_objs = paginator.page(page) except PageNotAnInteger: # 如果page不是整数,返回第1页 page_objs = paginator.page(1) except EmptyPage: # 如果page超出最大值 ,只显示最后一页 page_objs = paginator.page(paginator.num_pages) return page_objs
2)定义模板:paginator.html
<!--显示记录数--> <div class="dataTables_info" id="editable_info" role="status" aria-live="polite"> 显示 {{ page_objs.start_index }} 至 {{ page_objs.end_index }} 条,共 {{ page_objs.paginator.count }} 条记录 </div> <div class="text-right"> {% load page_tag %} <ul class="pagination"> <!--显示首页和上一页--> {% if page_objs.has_previous %} <li class="footable-page-arrow"><a data-page="first" href="?page=1">首页</a></li> <li class="footable-page-arrow"><a data-page="prev" href="?page={{ page_objs.previous_page_number }}">上一页</a></li> {% endif %} <!--显示页码,只通过自定义tag,实现只显示3个页码,--> {% for pg in page_objs.paginator.page_range %} <!--参数:当前页,循环页--> {% page_curent_show page_objs.number pg %} {% endfor %} <!--显示尾页和下一页--> {% if page_objs.has_next %} <li class="footable-page-arrow"><a data-page="next" href="?page={{ page_objs.next_page_number }}">下一页</a> </li> <li class="footable-page-arrow"><a data-page="last" href="?page={{ page_objs.paginator.num_pages }}">尾页</a> </li> {% endif %} </ul> </div>
3)显示页码,通过自定义tag,实现只显示3个页码:page_tag.py
# -*- coding:utf-8 -*- __author__ = 'lixiang' from django import template from django.utils.html import format_html register=template.Library() @register.simple_tag def page_curent_show(current_page,loop_page): """只显示3页码""" offset=abs(current_page-loop_page) if offset<3: if current_page==loop_page: #激活当前页 page_ele='<li class="footable-page active"><a data-page="1" href="?page=%s">%s</a></li>' %(loop_page,loop_page) else: page_ele='<li class="footable-page"><a data-page="1" href="?page=%s">%s</a></li>' %(loop_page,loop_page) return format_html(page_ele) else: return ""
4)视图调用示例
from utils.pages import page def menu_list(request): menu_objs=models.Menu.objects.all() page_objs=page(request,menu_objs,2) return render(request, "juser/menu_list.html",{"page_objs":page_objs})
5)页面嵌入分页
<table id="demo-foo-addrow" class="table table-bordered table-hover toggle-circle footable-loaded footable default" data-page-size="7"> <thead> <tr> <th data-sort-ignore="true" class="min-width footable-visible footable-first-column"></th> <th data-sort-initial="true" data-toggle="true" class="footable-visible footable-sortable footable-sorted">序号<span class="footable-sort-indicator"></span></th> <th class="footable-visible footable-sortable">菜单名<span class="footable-sort-indicator"></span></th> <th data-hide="phone, tablet" class="footable-visible footable-sortable">菜单位置<span class="footable-sort-indicator"></span></th> <th data-hide="phone, tablet" class="footable-visible footable-last-column footable-sortable"> 操作<span class="footable-sort-indicator"></span></th> </tr> </thead> <tbody> {% for menu_obj in page_objs %} <tr class="footable-even" style="display: table-row;"> <td class="footable-visible footable-first-column"> <button class="demo-delete-row btn btn-danger btn-xs"><i class="demo-pli-cross"></i> </button> </td> <td class="footable-visible"><span class="footable-toggle"></span>{{ forloop.counter }}</td> <td class="footable-visible">{{ menu_obj.name }}</td> <td class="footable-visible">{{ menu_obj.seq }}</td> <td class="footable-visible"> <a><span class="label label-success">查看</span></a> <a><span class="label label-dark">编辑</span></a> <a><span class="label label-table label-danger">删除</span></a> </td> </tr> {% endfor %} </tbody> <tfoot> <tr> <td colspan="7" class="footable-visible"> {% include "paginator.html" %} </td> </tr> </tfoot> </table> </div>