django分页器
网站页面的分页效果可以通过分页器实现
分页器的使用
urls.py
from django.contrib import admin
from django.urls import path
from app1 import views
urlpatterns = [
path('admin/', admin.site.urls),
path('index/', views.index),
]
views.py
```python
from django.shortcuts import render, HttpResponse
from app1.models import Book
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
# Create your views here.
创建表记录
def index(request):
for i in range(100):
Book.objects.create(title='book_%s' % i, price=i*i)
上面这种方式生成100条数据会很慢,因为每次都需要找到表,再插入记录
优化:使用bulk_create依次添加所有数据
def index(request):
book_list = [] # 存放book对象
for i in range(100):
book = Book(title='book_%s' % i, price=i*i)
book_list.append(book)
Book.objects.bulk_create(book_list) # 依次插入100条记录
return render(request, 'index.html')
展示
普通版
def index(request):
book_list = Book.objects.all()
return render(request, 'index.html', {'book_list': book_list})
使用分页器
def index(request):
book_list = Book.objects.all()
# 第一个参数为对象列表,第二个为每页显示的个数
paginator = Paginator(book_list, 10) # 每页显示10条
print(paginator.count) # 总数量
print(paginator.num_pages) # 总页数
print(paginator.page_range) # 页码的范围
page_01 = paginator.page(1) # 第2页的所有数据对象
print(page_01.has_next()) # 是否还有下一页
print(page_01.has_previous()) # 是否还有上一页
print(page_01.next_page_number()) # 下一页的页码
# print(page_01.previous_page_number()) # 上一页的页码
return render(request, 'index.html', {'page_01': page_01})
地址栏输入参数访问页面
def index(request):
book_list = Book.objects.all()
paginator = Paginator(book_list, 10)
current_num = int(request.GET.get("page", 1))
book_list = paginator.page(current_num)
return render(request, 'index.html', {'book_list': book_list})
加入前一页后一页按钮并分页显示
def index(request):
book_list = Book.objects.all()
paginator = Paginator(book_list, 2) # 故意设置每页显示两个,测试分页效果
current_num = 1 # 防止报错
# 捕获异常,防止用户直接在地址栏输入参数造成emptypage错误
try:
current_num = int(request.GET.get("page", 1)) # 获取当前页码
book_list = paginator.page(current_num)
except EmptyPage:
book_list = paginator.page(1) #出错时定位到首页
# 如果页数非常多时,换另外一种显示方式,显示当前页的前5页和后5页,共11页
if paginator.num_pages > 11:
if current_num - 5 < 1: # 如果当前页-5小于1
# page_range显示页面的范围
page_range = range(1, 11) # 展示0~11
elif current_num + 5 > paginator.num_pages: # 当前页+5大于总页数
page_range = range(current_num-5, paginator.num_pages+1)
else:
page_range = range(current_num-5, current_num+6)
else:
page_range = paginator.page_range
return render(request, 'index.html', {'book_list': book_list, 'paginator': paginator, 'current_num': current_num, 'page_range': page_range})
能在视图函数里获取到的变量就不要在页面获取
<br>
index.html
使用了bootstrap的分页组件,active当前页突出显示,disabled鼠标悬浮时显示禁止(实际上还是可以点,需要自己加入判断)
```python
<!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">
</head>
<body>
<h3>INDEX</h3>
{#<ul>#}
{# {% for book in book_list %}#}
{# <li>{{ book.title }}-->{{ book.price }}</li>#}
{# {% endfor %}#}
{#</ul>#}
{# 数据展示 #}
<ul>
{% for book in book_list %}
<li>{{ book.title }}-->{{ book.price }}</li>
{% endfor %}
</ul>
{#分页展示#}
<nav aria-label="Page navigation">
<ul class="pagination">
{% if book_list.has_previous %}
{# 有前一页,就-1,否则停留在当前页面 #}
<li>
<a href="?page={{ book_list.previous_page_number }}" aria-label="Previous">
{# 上一页按钮 #}
<span aria-hidden="true">«</span>
</a>
</li>
{% else %}
<li class="disabled">
{# 鼠标悬浮时显示禁止图标 #}
{# 跳转当前页面时,href可以不用写 #}
<a href="" aria-label="Previous">
{# 上一页按钮 #}
<span aria-hidden="true">«</span>
</a>
</li>
{% endif %}
{# 循环展示每一页的页码 #}
{% for i in page_range %}
{% if i == current_num %}
{# 当前页面 #}
<li class="active"><a href="?page={{ i }}">{{ i }}</a></li>
{% else %}
<li><a href="?page={{ i }}">{{ i }}</a></li>
{% endif %}
{% endfor %}
{% if book_list.has_next %}
<li>
<a href="?page={{ book_list.next_page_number }}" aria-label="Next">
{# 下一页按钮 #}
<span aria-hidden="true">»</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="?page={{ current_num }}" aria-label="Next">
{# 下一页按钮 #}
<span aria-hidden="true">»</span>
</a>
</li>
{% endif %}
</ul>
</nav>>
</body>
</html>
## 小结
### paginator的导入
```python
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
```
paginator的使用方法
book_list = Book.objects.all()
paginator = Paginator(book_list,10) # 每页显示10条
print(paginator.count) #数据总数 100
print(paginator.num_pages) # #总页数 10
print(paginator.page_range) #页码的列表 range(1, 11)
page_01 = paginator.page(2) #第2页的所有数据对象
print(page_01.has_next()) #是否有下一页
print(page_01.has_previous()) #是否有上一页
print(page_01.next_page_number()) #下一页的页码
print(page_01.previous_page_number()) #上一页的页码
django分页器的更多相关文章
- Django分页器的设置
Django分页器的设置 有时候在页面中数据有多条时很显然需要进行分页显示,那么在python中django可以这样设置一个分页处理 怎么样去设置呢? 我们要用到 Django 中的 Pagin ...
- Django 分页器的使用
Django 分页器的使用 Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能.利用Django自带的Paginator类,我们可以很 ...
- Django分页器和自定义分页器
一.自定义分页器 import copy class Pagination(): def __init__(self,request,current_page,all_data_num,each_pa ...
- django -----分页器组件
分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...
- Django 2.0 学习(19):Django 分页器
Django 分页器 要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器) views.py from django.shortcuts im ...
- Django - Cookie、Session、自定义分页和Django分页器
2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...
- Django 分页器 缓存 信号 序列化
阅读目录 分页器 缓存 信号 序列化 Django分页器 (paginator) 导入 from django.core.paginator import Paginator, EmptyPage, ...
- 7.Django|分页器
Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...
- 7 Django分页器文章分页
1.复习 2.这节课要解决的问题? 3.分页的原理 4.准备工作 (1)创建Django项目 C:\Users\Administrator\Desktop\root3>django-admin ...
随机推荐
- Vue学习之路2-项目初搭建
1.检查环境是否全部安装成功 2.创建项目 2.1.打开dos命令窗口,使用dos命令转到项目文件夹下: 2.2.输入创建项目命令:vue init webpack myproject1 创建不同的打 ...
- RabbitMQ广播:topic模式
topic模式跟direct差不多,只是把type改一下就行. direct是把固定的routing_key跟queue绑定,topic是把模糊的routing_key跟queue绑定 原理图: 发布 ...
- npm:Fatal error in , line 0 #unreachable code 解决
是nodejs环境本身的问题,下载nodejs执行repair即可
- SQL LCASE() 函数
LCASE() 函数 LCASE 函数把字段的值转换为小写. SQL LCASE() 语法 SELECT LCASE(column_name) FROM table_name SQL LCASE() ...
- WEB框架-Django组件学习-分页器学习
1.分页器基础学习 1.1 补充知识-批量创建 数据库中数据批量创建,不要每创建一个就往数据库中塞一个,会造成撞库,造成大量I/O操作,速速较慢,应该采用一次性创建大量数据,一次性将大量数据塞入到数据 ...
- ios自动打包-fastlane 安装、使用、更新和卸载
ios自动打包使用fastlane 1.首先安装xcode 首先检查是否已经安装 Xcode 命令行工具,fastlane 使用 xcodebuild 命令进行打包,运行 xcode-select - ...
- 好程序员分享居中一个float元素
好程序员分享居中一个float元素,我们布局的时候,用margin来设置float元素的外边距来达到效果.对于,在文档流中的元素,我们很容易让它水平居中,只要给元素设置一个固定的宽度,用margin: ...
- Linux内核入门到放弃-Ext2数据结构-《深入Linux内核架构》笔记
Ext2文件系统 物理结构 结构概观 块组是该文件系统的基本成分,容纳了文件系统的其他结构.每个文件系统都由大量块组组成,在硬盘上相继排布: ----------------------------- ...
- 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处
本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...
- FineUIPro v5.2.0已发布(jQuery升级,自定义图标,日期控件)
FineUIPro/MVC/Core/JS v5.2.0 已经于 2018-8-20 发布,官网示例已更新,如果大家在测试中发现任何问题,请回复本帖,谢谢了. 在线示例: FineUI Pro:htt ...