导入

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

Page对象

Paginator.page()将返回一个Page对象,我们主要的操作都是基于Page对象的,它具有下面的方法和属性:

方法:

  • Page.has_next()[source]:如果有下一页,则返回True。
  • Page.has_previous()[source]:如果有上一页,返回 True。
  • Page.has_other_pages()[source]:如果有上一页或下一页,返回True。
  • Page.next_page_number()[source]:返回下一页的页码。如果下一页不存在,抛出InvalidPage异常。
  • Page.previous_page_number()[source]:返回上一页的页码。如果上一页不存在,抛出InvalidPage异常。

属性:

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

Paginator对象

Paginator类拥有以下方法和属性:

方法:

Paginator.page(number)[source]

返回指定页面的对象列表,比如第7页的所有内容,下标以1开始。如果提供的页码不存在,抛出InvalidPage异常。

属性:

  • Paginator.count:所有页面的对象总数。
  • Paginator.num_pages:页面总数。
  • Paginator.page_range:基于1的页数范围迭代器。

处理异常

在实际使用中,可能恶意也可能不小心,用户请求的页面,可能千奇百怪。正常我们希望是个合法的1,2,3之类,但请求的可能是‘apple’,‘1000000’,‘#’,这就有可能导致异常,需要特别处理。Django为我们内置了下面几个,Paginator相关异常。

  • exception InvalidPage[source]:异常的基类,当paginator传入一个无效的页码时抛出。
  • exception PageNotAnInteger[source]:当向page()提供一个不是整数的值时抛出。
  • exception EmptyPage[source]:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出。

使用

book.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>book</title>
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<div class="container"> <h4>分页器</h4>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>编号</th>
<th>书籍名称</th>
<th>价格</th>
<th>出版日期</th> </tr>
</thead>
<tbody> {% for book in books %}
<tr>
<td>{{ forloop.counter }}</td>
<td id="book_title">{{ book.title }}</td>
<td id="book_price">{{ book.price }}</td>
<td id="book_publishDate">{{ book.publishDate|date:'Y-m-d' }}</td> </tr>
{% endfor %} </tbody>
</table> <ul class="pagination" id="pager">
<li><a href="?page=1" aria-label="Previous">
<span aria-hidden="true">首页</span>
</a></li> {% if books.has_previous %}
<li class="previous"><a href="?page={{ books.previous_page_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %} {% for num in paginator.page_range %} {% if num == currentPage %}
<li class="item active"><a href="?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="?page={{ num }}">{{ num }}</a></li> {% endif %}
{% endfor %} {% if books.has_next %}
<li class="next"><a href="?page={{ books.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %}
<li><a href="?page={{ paginator.num_pages }}" aria-label="Previous">
<span aria-hidden="true">末页</span>
</a></li> </ul>
</div> </body> </html>

  

url.py

app_name = 'polls'
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
path('<int:pk>/', views.DetailView.as_view(), name='detail'),
path('<int:pk>/results/', views.ResultsView.as_view(), name='results'),
path('<int:question_id>/vote/', views.vote, name='vote'),
path('listbook/', views.listBook, name='listbook'),
]

view.py

from .models import Book
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def listBook(request):
'''
批量导入数据:
'''
book_l = []
# for i in range(30):
# book_l.append(Book(title="book" + str(i), price=20 + i * 2))
# Book.objects.bulk_create(book_l) book_list = Book.objects.all().order_by('nid')
# # 分页器
paginator = Paginator(book_list, 5) # 每页显示5条 # # print("count:", paginator.count) # 数据总数
# # print("num_pages", paginator.num_pages) # 总页数
# # print("page_range", paginator.page_range) # 页码的列表
# #
# # page1 = paginator.page(1) # 第1页的page对象
# # for i in page1: # 遍历第1页的所有数据对象
# # print(i)
# #
# # print(page1.object_list) # 第1页的所有数据
# #
# # page2 = paginator.page(2)
# #
# # print(page2.has_next()) # 是否有下一页
# # print(page2.next_page_number()) # 下一页的页码
# # print(page2.has_previous()) # 是否有上一页
# # print(page2.previous_page_number()) # 上一页的页码
page = request.GET.get('page', 1)
currentPage = int(page) try:
print(page)
books = paginator.page(page)
print(books)
except PageNotAnInteger:
# 如果请求的页数不是整数,返回第一页。
books = paginator.page(1)
except EmptyPage:
# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
books = paginator.page(paginator.num_pages) return render(request, 'polls/book.html', locals())

  

如果页数比较多,可以使用下一种方式

def listBook(request):
'''
批量导入数据:
'''
book_l = []
# for i in range(30):
# book_l.append(Book(title="book" + str(i), price=20 + i * 2))
# Book.objects.bulk_create(book_l) book_list = Book.objects.all().order_by('nid')
# # 分页器
paginator = Paginator(book_list, 5) # 每页显示5条 # # print("count:", paginator.count) # 数据总数
# # print("num_pages", paginator.num_pages) # 总页数
# # print("page_range", paginator.page_range) # 页码的列表
# #
# # page1 = paginator.page(1) # 第1页的page对象
# # for i in page1: # 遍历第1页的所有数据对象
# # print(i)
# #
# # print(page1.object_list) # 第1页的所有数据
# #
# # page2 = paginator.page(2)
# #
# # print(page2.has_next()) # 是否有下一页
# # print(page2.next_page_number()) # 下一页的页码
# # print(page2.has_previous()) # 是否有上一页
# # print(page2.previous_page_number()) # 上一页的页码
page = request.GET.get('page', 1)
currentPage = int(page)
# 当页数小于4页时,只显示4页
print('currentPage=',currentPage )
if paginator.num_pages > 3:
if currentPage - 3 < 1:
pageRange = range(1, 5)
elif currentPage + 3 > paginator.num_pages:
pageRange = range(currentPage - 3, paginator.num_pages + 1) else:
pageRange = range(currentPage - 3, currentPage + 3) else:
pageRange = paginator.page_range
try:
print(page)
books = paginator.page(page)
print(books)
except PageNotAnInteger:
# 如果请求的页数不是整数,返回第一页。
books = paginator.page(1)
except EmptyPage:
# 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
books = paginator.page(paginator.num_pages) return render(request, 'polls/book.html', locals())

html

<ul class="pagination" id="pager">
<li><a href="?page=1" aria-label="Previous">
<span aria-hidden="true">首页</span>
</a></li> {% if books.has_previous %}
<li class="previous"><a href="?page={{ books.previous_page_number }}">上一页</a></li>
{% else %}
<li class="previous disabled"><a href="#">上一页</a></li>
{% endif %} {% for item in pageRange %}
{% if currentPage == item %}
<li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
{% else %}
<li><a href="?page={{ item }}">{{ item }}</a></li>
{% endif %}
{% endfor %} {% if books.has_next %}
<li class="next"><a href="?page={{ books.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %}
<li><a href="?page={{ paginator.num_pages }}" aria-label="Previous">
<span aria-hidden="true">末页</span>
</a></li> </ul>

最新文章

  1. Hyper-V初涉_共享式网络链接
  2. Final-阶段站立会议1
  3. [游戏学习24] MFC 各种绘图 字体学习
  4. associated 2 maps
  5. Codeforces Round #197 (Div. 2) : C
  6. flexbox语法(摘抄)
  7. swing-窗体添加背景图片的2种方法
  8. windows 下的 Rsync 同步
  9. Android 手机连不上电脑
  10. python 格式化向sql语句输出元组
  11. dnsmasq 设置自动获取主机名
  12. Tiny6410 裸机开发--裸机点亮LED
  13. Java开发环境配置(5)--Web 服务器--Tomcat--安装过程遇到的问题
  14. rsync的daemon模式
  15. centos svn强制要求提交代码时写注释
  16. docker容器内外相互拷贝数据
  17. Beta阶段对团队成员公开感谢
  18. HOW-TO GEEK SCHOOL
  19. PhpStorm 配置在浏览器中打开文件
  20. [翻译] JSAnimatedImagesView

热门文章

  1. Android研发技术的进阶之路
  2. 浅谈JS之Error对象
  3. CF472G Increase the Constraints
  4. 学习:STL_vector容器
  5. FFT代码详解
  6. gtibase rpm包制作
  7. pipelinewise 学习一 docker方式安装
  8. A1128 | 逻辑想象能力、简洁高效美观的代码、memset的使用情景
  9. js读取sqlserver数据库,输出至html
  10. 【Spring Boot】内嵌容器