Django 2.0 学习(19):Django 分页器
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 分页器的更多相关文章
- Django 2.0 学习(07):Django 视图(进阶-续)
接Django 2.0 学习(06):Django 视图(进阶),我们将聚焦在使用简单的表单进行处理和精简代码. 编写简单表单 我们将用下面的代码,来替换之前的detail模板("polls ...
- Django 2.0 学习(04):Django数据库
数据库设置/配置 打开mysite/settings.py,我们会发现Django是用的是默认的数据库SQLite,如下图所示: Django也是支持其它数据库的,比如PostgreSQL.MySQL ...
- Django 2.0 学习
Django django是基于MTV结构的WEB框架 Model 数据库操作 Template 模版文件 View 业务处理 在Python中安装django 2.0 1 直接安装 pip inst ...
- Django 2.0 学习(12):Django 模板语法
Django 模板语法 一.模板 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法 模板语法变量:{{ }} 在Django模板中遍历复杂数据结构的关键是句点字 ...
- Django 2.0 学习(08):Django 自动化测试
编写我们的第一个测试 确定bug 幸运的是,在polls应用中存在一个小小的bug急需修复:无论Question的发布日期是最近(最后)的日期,还是将来很多天的日期,Question.was_publ ...
- Django 2.0 学习(06):Django 视图(进阶)
概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...
- Django 2.0 学习(03):Django视图和URL(下)
接上篇博文,继续分析Django基本流程. 编写第一个(view)视图函数 1.打开文件polls/views.py,输入下面的Python代码: from django.http import Ht ...
- Django 2.0 学习(01):Django初识与安装
Django(Python Web框架) Django是一个开放源代码的Web框架,用Python写的.采用了MTV的框架模式,即模型M,模板T和视图V.它最初被开发是用来管理以新闻内容为主的网站,即 ...
- Django 2.0 学习(13):Django模板继承和静态文件
Django模板继承和静态文件 模板继承(extend) Django模板引擎中最强大也是最复杂的部分就是模板继承了,模板继承可以让我们创建一个基本的"骨架"模板,它可以包含网页中 ...
随机推荐
- mtr语言真是逆天了
实践证明,设计一个语言,还不是简单的解释没一行哦
- Async方法死锁的问题 Don't Block on Async Code(转)
今天调试requet.GetRequestStreamAsync异步方法出现不返回的问题,可能是死锁了.看到老外一篇文章解释了异步方法死锁的问题,懒的翻译,直接搬过来了. http://blog.st ...
- python+appium 实现qq聊天的消息,滑动删除聊天消息
有人问我,appium怎么去删除qq聊天的, 当时想到的是滑动, 可是具体的大概有个思路,于是乎,就想自己来实现下, 打开模拟器,开发者选项,找到显示坐标的 然后去打开qq获取要删除的消息的坐标后, ...
- oracle出现无法修改的异常记录
oracle数据库(PLSQL登录器),修改时遇到无法修改以前的记录. 解决方法: 是因为session正在操作(有锁),出现的假象让你觉得执行了sql却无法显示出修改的数据. 一个操作用户未完成操作 ...
- BLACKPYTHON学习(一)
C/S结构了解 所谓的C/S就是客户端(client)和服务器端(server)的简称,也就是在基于这个的基础上编写相关的代码:一个就是客户端一个就是服务端. TCP(client) 客户端编写 #因 ...
- Linux之服务器介绍
服务器,也称伺服器,是提供计算服务的设备.由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力. 服务器: 服务器指的是网络中能对其他机器提供某些服务的计算机系统 ...
- scrapy的简单使用
使用之前的创建虚拟环境方法(pipenv) 创建虚拟环境并进入虚拟环境 mkdir douban cd douban pipenv install pipenv shell 再安装我们的scrapy ...
- Spring Boot 学习目录
之前一直做.net 的开发,后来发现C# 在生态方面和Java还是差了好多,而且目前有很多.net 方面的技术也是借鉴了Java相关的开发,所以最近准备学习了解一下java 相关的web开发,从中学习 ...
- Python发送邮件(最全)
简单邮件传输协议(SMTP)是一种协议,用于在邮件服务器之间发送电子邮件和路由电子邮件. Python提供smtplib模块,该模块定义了一个SMTP客户端会话对象,可用于使用SMTP或ESMTP侦听 ...
- SpringCloud学习:Eureka、Ribbon和Feign
Talk is cheap,show me the code , 书上得来终觉浅,绝知此事要躬行.在自己真正实现的过程中,会遇到很多莫名其妙的问题,而正是在解决这些问题的过程中,你会发现自己之前思维的 ...