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. Eclipse启动Tomcat错误:Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are already

    Eclipse启动Tomcat错误: Several ports (8080, 8009) required by Tomcat v6.0 Server at localhost are alread ...

  2. How to: Display a Non-Persistent Object's List View from the Navigation

    This example demonstrates how to display a non-persistent object's List View when a navigation item ...

  3. CSS3新增特性详解(二)

    上篇博文主要介绍了CSS3新增特性中的静态特性,比如新的选择器.多背景图.阴影.渐变等.本文主要介绍CSS3中新增的动态特性,如过度.动画.变形等. transitian:  -webkit-tran ...

  4. Python学习过程笔记整理(四)

    变量作用域 -分类 -全局(global):在函数外部定义:整个全局范围都有效 -局部(local):在函数内部定义:仅在局部范围有效 -提升局部变量为全局变量 -使用global -globals, ...

  5. 【转】Appium 中截取 element 图片作为对比,判断对比结果

    其实在https://github.com/gb112211/Adb-For-Test 里面有一个截取element进行对比的方法,但是在使用appium时是无法使用的,因为其用到了uiautomat ...

  6. python魔法方法大全

    1.python魔法方法详解: python魔法方法是可以修改重载的,如果你的对象实现(重载)了这些方法中的某一个,那么这个方法就会在特殊的情况下被 Python 所调用,你可以定义自己想要的行为,而 ...

  7. 2.深入解析数据类型与变量——《Excel VBA 程序开发自学宝典》

    2.1 数据类型 数据类型 所占字节 Byte 1 Boolean 2 Integer 2 Long 4 Single 4 Double 8 Currency 8 Decimal 14 Date 8 ...

  8. SSO流程

    SSO SSO又名单点登录,用户只需要登录一次就可以访问权限范围内的所有应用子系统.举个简单的例子,你在百度首页登录成功之后,你再访问百度百科.百度知道.百度贴吧等网站也会处于登录状态了,这就是一个单 ...

  9. java之接口开发-初级篇

    简述:转眼之间已经开发java有五年之余了,从以前的刚刚接触电脑,到现在的公司上班,真是转眼之间呀!前两年开发过前端,后台和Android,Android火的那几年,差点转去做Android,哈哈!后 ...

  10. sqli-labs学习笔记 DAY6

    DAY 6 sqli-labs lesson 30 与上一题一样,需要用到HPP 查看源代码,参数两边加上了双引号,直接使用lesson 26a与lesson 27a的脚本即可 sqli-labs l ...