Django 分页器

要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器)

views.py

from django.shortcuts import render

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

from BookSite.models import *

def index(request):

"""

批量导入数据

book_list = []

for i in range(100):

book_list.append(Book(title="book"+str(i), price=30+i**2))

Book.objects.bulk_create(book_list)

"""

"""
分页器的使用
book_list = Book.objects.all()
paginator = Paginator(book_list, 10)
print("count:", paginator.count) # 总数居
print("num_pages", paginator.num_pages) # 总页数
print("page_range", paginator.page_range) # 页面的列表 page_one = paginator.page(1) # 第一页的page对象
for i in range(page_one): # 遍历第1页的所有数据对象
print(i)
print(page_one.object_list) # 第1页所有数据 page_two = paginator.page(2)
print(page_two.has_next()) # 是否有下一页
print(page_two.next_page_number()) # 下一页的页码
print(page_two.has_previous()) # 是否有上一页
print(page_two.previous_page_number()) # 上一页的页码 # 抛出错误
page = paginator.page(12) # Error:EmptyPage
page = paginator.page("z") # Error:PageNotAnInteger
""" book_list = Book.objects.all()
paginator = Paginator(book_list, 10)
page = request.GET.get("page", 1)
current_page = int(page) try:
print(page)
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page(1)
except EmptyPage:
book_list = paginator.page(paginator.num_pages) return render(request, "index.html", {
"book_list": book_list,
"paginator": paginator,
"current_page": current_page
})

def retrieve(request):

"""

批量导入

book_list = []

for i in range(100):

book_list.append(models.Book(title="book"+str(i), price=20+i*i))

models.Book.objects.bulk_create(book_list)

"""

book_list = Book.objects.all()              # book_list打印的是一个对象 查询所有的书
paginator = Paginator(book_list, 5) # 这里的book_list必须是一个集合对象,把所有的书分页,每页5个
print(paginator.page_range) # range(1, 4)
amount = request.GET.get("page", 2) # 得到页数范围 默认有1页
print(amount, type(amount))
book_list = paginator.page(amount) # 显示第1页的内容
return render(request, "retrieve.html", {
"book_list": book_list,
"page_range": paginator.page_range,
"amount": int(amount),
"paginator": paginator
})

**index.html** ```html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</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>
<body> <div class="container"> <h4>分页器</h4>
<ul> {% for book in book_list %}
<li>{{ book.title }} -----{{ book.price }}</li>
{% endfor %} </ul> <ul class="pagination" id="pager"> {% if book_list.has_previous %}
<li class="previous"><a href="/index/?page={{ book_list.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="/index/?page={{ num }}">{{ num }}</a></li>
{% else %}
<li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li> {% endif %}
{% endfor %} {% if book_list.has_next %}
<li class="next"><a href="/index/?page={{ book_list.next_page_number }}">下一页</a></li>
{% else %}
<li class="next disabled"><a href="#">下一页</a></li>
{% endif %} </ul>
</div> </body>
</html>

分页器扩展(views.py)

def index(request):

    book_list=Book.objects.all()

    paginator = Paginator(book_list, 15)
page = request.GET.get('page',1)
currentPage=int(page) # 如果页数十分多时,换另外一种显示方式
if paginator.num_pages>30: if currentPage-5<1:
pageRange=range(1,11)
elif currentPage+5>paginator.num_pages:
pageRange=range(currentPage-5,paginator.num_pages+1) else:
pageRange=range(currentPage-5,currentPage+5) else:
pageRange=paginator.page_range try:
print(page)
book_list = paginator.page(page)
except PageNotAnInteger:
book_list = paginator.page(1)
except EmptyPage:
book_list = paginator.page(paginator.num_pages) return render(request,"index.html",locals())

分页组件

1.分页的实现与使用

class Pagination(object):
"""自定义分页"""
def __init__(self, current_page, total_count, base_url, params, pre_page_count=10, max_page_count=11):
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page <= 0:
self.current_page = 1 self.current_page = current_page
self.total_count = total_count # 数据总条数
self.pre_page_count = pre_page_count # 每页显示10条数据
max_page_num, div = divmod(total_count, pre_page_count) # 页面上因该显示的最大页码
if div:
max_page_num += 1
self.max_page_num = max_page_num self.max_page_count = max_page_count # 页面上默认显示11个页码(当前页在中间)
self.half_max_page_count = int((max_page_count-1)/2)
self.base_url = base_url # URL前缀 import copy
params = copy.deepcopy(params) # request.GET
params._mutable = True
# 包含当前列表页面所有的搜索条件
# {source: [2, ], status: [2, ], gender: [2, ], consultant: [1, ], page: [2, ]}
# self.params[page] = 8
# self.params.urlencode()
# source=2&status=2&gender=2&consultant=1&page=8
# href = "/hosts/?source=2&status=2&gender=2&consultant=1&page=8"
# href = "%s?%s" % (self.base_url, self.params.urlencode())
self.params = params @property
def start(self):
render(self.current_page-1) * self.pre_page_count @property
def end(self):
return self.current_page * self.pre_page_count def page_html(self):
# 如果总页数小于等于11
if self.max_page_num <= self.max_page_count:
page_start = 1
page_end = self.max_page_num
else: # 如果总页数大于11
# 如果当前页小于等于5
if self.current_page <= self.half_max_page_count:
page_start = 1
page_end = self.max_page_count
else: # 如果当前页+5大于总页码
if (self.current_page + self.half_max_page_count) > self.max_page_num:
page_end = self.max_page_num
page_start = self.max_page_num - self.max_page_count+1 # 倒着数11个
else:
page_start = self.current_page - self.half_max_page_count
page_end = self.current_page - self.half_max_page_count
page_list = []
# {source:[2,], status:[2], gender:[2],consultant:[1],page:[1]}
# 首页
self.params["page"] = 1
first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url, self.params.urlencode(),)
page_list.append(first_page) # 上一页
self.params["page"] = self.current_page-1
if self.params["page"] < 1:
previous_page = '<li class="disabled"><a href="%s?%s" aria-label="Previous">上一页</span></a></li>' %
(self.base_url, self.params.urlencode())
else:
previous_page = '<li><a href = "%s?%s" aria-label = "Previous" >上一页</span></a></li>' % (
self.base_url, self.params.urlencode())
page_list.append(previous_page) # 中间页码
for i in range(page_start, page_end + 1):
self.params['page'] = i
if i == self.current_page:
temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url, self.params.urlencode(), i,)
else:
temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.params.urlencode(), i,)
page_list.append(temp) # 下一页
self.params["page"] = self.current_page + 1
if self.params["page"] > self.max_page_num:
self.params["page"] = self.current_page
next_page = '<li class="disabled"><a href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (
self.base_url, self.params.urlencode())
else:
next_page = '<li><a href = "%s?%s" aria-label = "Next">下一页</span></a></li>' % (
self.base_url, self.params.urlencode())
page_list.append(next_page) # 尾页
self.params['page'] = self.max_page_num
last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url, self.params.urlencode(),)
page_list.append(last_page) return ''.join(page_list)

2.使用

# 自定义分页组件的使用方法:
pager_obj = Pagination(request.GET.get('page',1), len(HOST_LIST), request.path_info,request.GET)
host_list = HOST_LIST[pager_obj.start:pager_obj.end]
html = pager_obj.page_html()
return render(request, 'hosts.html', {'host_list':host_list,"page_html":html})

Django 2.0 学习(19):Django 分页器的更多相关文章

  1. Django 2.0 学习(07):Django 视图(进阶-续)

    接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...

  2. Django 2.0 学习(04):Django数据库

    数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...

  3. Django 2.0 学习

    Django django是基于MTV结构的WEB框架 Model 数据库操作 Template 模版文件 View 业务处理 在Python中安装django 2.0 1 直接安装 pip inst ...

  4. Django 2.0 学习(12):Django 模板语法

    Django 模板语法 一.模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法 模板语法变量:{{ }} 在Django模板中遍历复杂数据结构的关键是句点字 ...

  5. Django 2.0 学习(08):Django 自动化测试

    编写我们的第一个测试 确定bug 幸运的是,在polls应用中存在一个小小的bug急需修复:无论Question的发布日期是最近(最后)的日期,还是将来很多天的日期,Question.was_publ ...

  6. Django 2.0 学习(06):Django 视图(进阶)

    概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...

  7. Django 2.0 学习(03):Django视图和URL(下)

    接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...

  8. Django 2.0 学习(01):Django初识与安装

    Django(Python Web框架) Django是一个开放源代码的Web框架,用Python写的.采用了MTV的框架模式,即模型M,模板T和视图V.它最初被开发是用来管理以新闻内容为主的网站,即 ...

  9. Django 2.0 学习(13):Django模板继承和静态文件

    Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...

随机推荐

  1. SpringBoot日记——登录与拦截器篇

    之前的文章我们把登录页写了出来,但是想要让登录现实他的基本功能,要如何做呢?本篇文章就来帮你实现第一步,让登录页对账号密码做校验,并且完成登录跳转. LoginController 1. 要实现登录, ...

  2. svn树冲突的解决方法

    树冲突 就是开发人员移动.重命名.删除一个文件或文件夹,而另一名开发人员也对它们进行了移动.重命名.删除或者仅仅是修改时就会发生树冲突.有很多种不同的情形可以导致树冲突,而且不同的情形需要不同的步骤来 ...

  3. 容器类 - bootStrap4常用CSS笔记

    .container 居中容器类,最大宽度默认为1200px.左右间隙15px .container-fluid 全屏容器类. .jumbotron 创建一个大的灰色的圆角背景框 .jumbotron ...

  4. 3星|《实战复盘第四季·商业巨头们的变革之道》:GE、TCL、力拓集团、英美资源集团等企业总裁的变更经验

    实战复盘第四季·商业巨头们的变革之道(<哈佛商业评论>增刊) 本期是<哈佛商业评论>“实战复盘”栏目的10篇文章,讲的是GE.TCL.力拓集团.英美资源集团等企业如何熬过变革期 ...

  5. c++面向对象程序设计总结(类的使用)

    本篇算是学习c++有关类的知识的一些易错点吧..... 并不是特别详细,以后会更新吧.... 几点并不关于类的东西 1.函数模板,用虚拟类型来实现模板的功能 #include<iostream& ...

  6. 打包应用和构建Docker镜像(docker在windows上)

    在构建Docker时编译应用 一般有两种方法在构建镜像时进行打包应用.第一种方法就是使用基本的镜像,该镜像包括应用平台和构建工具,因此在Dockerfile中,复制源代码到镜像中并在构建镜像时编译ap ...

  7. Erlang的调度原理(译文)

    原文 http://jlouisramblings.blogspot.com/2013/01/how-erlang-does-scheduling.html 免爬墙链接 http://www.diku ...

  8. 1.centos6.8安装docker

    简介环境安装依赖安装步骤1.删除旧版本的docker2.安装docker2.1 yum安装docker2.2 tar安装2.3 在线脚本事实证明以上的安装方式都行不通 参考文档:https://doc ...

  9. Navicat将oracle中数据复制到mysql

    1,首先两个数据库都要处于连接状态 2,工具 -- 数据传输 3,选择来源数据库以及要传输的表和目标数据库 4,点击开始 PS:遇到一个问题:[Err] [Dtf] 1426 - Too-big pr ...

  10. 20172324 2017-2018-2《程序设计与数据结构》第五周 n!的计算

    20172324 2017-2018-2<程序设计与数据结构>实验2报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 曾程 学号:20172324 实验教师:王志强 ...