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 ...
随机推荐
- #022 Python 实验课
拍7游戏 描述 “拍7游戏”规则是:一堆人围成一圈,开始时,任意指定一人说出数字“1”后,一圈人按顺时针方向,每人按整数由小到大的顺序一人一个地报出后续数字“2”.“3”......,当遇到为“7”的 ...
- c#语法学习
自动属性.隐试类型.命名参数和自动初始化器. note:这里说的这些,是语法糖.按照一定的格式写,部分代码编译器帮我们实现了, 1.自动属性:自动属性是非常有用的语法糖,帮我我们做了两件事:1.自动帮 ...
- nginx日志切割(logrotate或shell脚本)
nginx自己不会对日志文件进行切割,可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本. 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管 ...
- vue 应用生产环境的 webpack 打包配置优化
转:https://blog.csdn.net/robin_star_/article/details/83856363 前言:很好的打包优化的帖子,还没来的急去实测验证 1. 去掉 console ...
- Linux运维基础
一.服务器硬件 二.Linux的发展史 三.Linux的系统安装和配置 四.Xshell的安装和优化 五.远程连接排错 六.Linux命令初识 七.Linux系统初识与优化 八.Linux目录结构 九 ...
- python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...
- centos7下kubernetes(13。kubernetes-探讨service IP)
service cluster IP是一个虚拟IP,是由kubernetes节点上的iptables规则管理的 通过iptables-save | grep 10.105.215.156看到与clus ...
- Kafka 详解(二)------集群搭建
这里通过 VMware ,我们安装了三台虚拟机,用来搭建 kafka集群,虚拟机网络地址如下: hostname ipaddress ...
- rocketmq 4.4部署安装
官网下载:rocketmq-all-4.4.0-bin-release.zip 准备环境:centos7.6 Maven Java8+ 操作: 在工作目录中进行如下操作: /home/software ...
- openstack搭建之-keystone配置(8)
一. Base Node配置 mysql -uroot -proot CREATE DATABASE keystone GRANT ALL PRIVILEGES ON keystone.* to 'k ...