Django提供了一個新的類來幫助你管理分頁數據,.它能夠接收列表、元組或其它可迭代的對象。html
>>> 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
定義工具,可供多個頁面使用。django
效果以下:less
1)定義方法:pages.pyide
# -*- 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.pyoop
# -*- 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)視圖調用示例 post
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)頁面嵌入分頁this
<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>