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. How to: Provide Credentials for the Dashboards Module when Using External Data Sources

    XAF中使用dashboard模块时,如果使用了sql数据源,可以使用此方法提供连接信息 https://www.devexpress.com/Support/Center/Question/Deta ...

  2. 【前端模板之路】一、重构的兄弟说:我才不想看你的代码!把HTML给我交出来!

    写在前面 随着前端领域的发展和社会化分工的需要,继前端攻城湿之后,又一重要岗位横空出世——重构攻城湿!所谓的重构攻城湿,他们的一大特点之一,就是精通CSS配置文件的编写...前端攻城湿跟重构攻城湿是一 ...

  3. zabbix监控DELL服务器硬件状态

    zabbix监控DELL服务器硬件状态 登录dell服务的管理页面 默认用户名:root 密码:calvin 服务器开放snmp信息,开启完应用 Zabbix服务器导入dell监控硬件模板 验证 sn ...

  4. C++ chrono 库中的 steady_clock 和 system_clock

    C++11 中提供了一个计时的标准库 <chrono>; 里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock ...

  5. 正则表达式的捕获组(Java)

    捕获组分类 普通捕获组(Expression) 命名捕获组(?<name>Expression) 普通捕获组 从正则表达式左侧开始,每出现一个左括号“(”记做一个分组,分组编号从1开始.0 ...

  6. thymeleaf 使用javascript定义数组报错

    js中免不了的要用的数组,一维的二维的三维的 但是当用到thymeleaf作为模版时候会有一些坑,导致数组不能用 org.thymeleaf.exceptions.TemplateProcessing ...

  7. python3之三级菜单

    city = { "江苏省": { "南京市": { "栖霞区": ["aa", "bb"], &q ...

  8. 搭建Harbor私有镜像仓库--v1.5.1

     搭建Harbor私有镜像仓库--v1.5.1 1.介绍 Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境 ...

  9. 关于MySql8.X设置允许root远程登陆的问题

    这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...

  10. LeetCode 455. Assign Cookies (C++)

    题目: Assume you are an awesome parent and want to give your children some cookies. But, you should gi ...