Django实现分页器功能
要使用Django实现分页器,必须从Django中导入Paginator模块
from django.core.paginator import Paginator
假如现在有150条记录要显示,每页显示10条
1 >>> from django.core.paginator import Paginator#导入Paginator模块 2 >>> list1=[i for i in range(0,150)]#使用列表生成器生成一个包含150个数字的列表 3 >>> page1=Paginator(list1,10)#生成一个Paginator对象 4 >>> print(page1.count)#打印总的记录数,即列表list1的长度 5 150 6 >>> print(page1.num_pages)#打印总的页数,即总记录数除以每页显示的条目数 7 15 8 >>> print(page1.page_range)#页数的列表 9 range(1, 16) 10 >>> print(page1.page(1))#打印第一页的page对象 11 <Page 1 of 15> 12 >>> page1.page(1).object_list#打印第一页的所有记录 13 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 14 >>> page1.page(2).object_list#打印第二页的所有记录 15 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 16 >>> page1.page(2).next_page_number()#打印当前的页(第2页)的下一页的页码 17 3 18 >>> page1.page(2).has_next()#第2页是否有下一页 19 True 20 >>> page1.page(2).has_previous()#第2页是否有上一页 21 True 22 >>> page1.page(2).has_other_pages()#第2是否有其他页 23 True 24 >>> page1.page(2).start_index()#第2页第一条记录的序号 25 11 26 >>> page1.page(2).end_index()#第2页最后一条记录的序号 27 20 28 >>> page1.page(0)#第0页是否有记录,会报错 29 Traceback (most recent call last): 30 File "<stdin>", line 1, in <module> 31 ... 32 raise EmptyPage(_('That page number is less than 1')) 33 django.core.paginator.EmptyPage: <exception str() failed> 34 >>> page1.page(15)#打印第15页的对象 35 <Page 15 of 15>
例子,使用Django实现一个分页效果
前端代码:
1 {% load staticfiles %} 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <meta charset="UTF-8"> 6 <title>Title</title> 7 <link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.css' %}"> 8 </head> 9 <body> 10 <div class="container"> 11 <h4>分页器</h4> 12 <ul> 13 #遍历boot_list中的所有元素 14 {% for book in book_list %} 15 #打印书籍的名称和价格 16 <li>{{ book.title }} {{ book.price }}</li> 17 {% endfor %} 18 </ul> 19 <ul class="pagination" id="pager"> 20 {#上一页按钮开始#} 21 {# 如果当前页有上一页#} 22 {% if book_list.has_previous %} 23 {# 当前页的上一页按钮正常使用#} 24 <li class="previous"><a href="/?page={{ book_list.previous_page_number }}">上一页</a></li> 25 {% else %} 26 {# 当前页的不存在上一页时,上一页的按钮不可用#} 27 <li class="previous disabled"><a href="#">上一页</a></li> 28 {% endif %} 29 {#上一页按钮结束#} 30 {# 页码开始#} 31 {% for num in paginator.page_range %} 32 33 {% if num == currentPage %} 34 <li class="item active"><a href="/?page={{ num }}">{{ num }}</a></li> 35 {% else %} 36 <li class="item"><a href="/?page={{ num }}">{{ num }}</a></li> 37 38 {% endif %} 39 {% endfor %} 40 {#页码结束#} 41 {# 下一页按钮开始#} 42 {% if book_list.has_next %} 43 <li class="next"><a href="/?page={{ book_list.next_page_number }}">下一页</a></li> 44 {% else %} 45 <li class="next disabled"><a href="#">下一页</a></li> 46 {% endif %} 47 {# 下一页按钮结束#} 48 </ul> 49 </div> 50 </body> 51 </html>
后端代码:
1 #导入render和HttpResponse模块 2 from django.shortcuts import render,HttpResponse 3 4 #导入Paginator,EmptyPage和PageNotAnInteger模块 5 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger 6 7 #从Django项目的应用中导入模块 8 from app01.models import * 9 10 def index(request): 11 12 #获取Book数据表中的所有记录 13 book_list=Book.objects.all() 14 15 #生成paginator对象,定义每页显示10条记录 16 paginator = Paginator(book_list, 10) 17 18 #从前端获取当前的页码数,默认为1 19 page = request.GET.get('page',1) 20 21 #把当前的页码数转换成整数类型 22 currentPage=int(page) 23 24 try: 25 print(page) 26 book_list = paginator.page(page)#获取当前页码的记录 27 except PageNotAnInteger: 28 book_list = paginator.page(1)#如果用户输入的页码不是整数时,显示第1页的内容 29 except EmptyPage: 30 book_list = paginator.page(paginator.num_pages)#如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容 31 32 return render(request,"index.html",locals())