网站页面的分页效果可以通过分页器实现

分页器的使用

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">&laquo;</span>
</a>
</li>
{% else %}
<li class="disabled">
{# 鼠标悬浮时显示禁止图标 #}
{# 跳转当前页面时,href可以不用写 #}
<a href="" aria-label="Previous">
{# 上一页按钮 #}
<span aria-hidden="true">&laquo;</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">&raquo;</span>
</a>
</li>
{% else %}
<li class="disabled">
<a href="?page={{ current_num }}" aria-label="Next">
{# 下一页按钮 #}
<span aria-hidden="true">&raquo;</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分页器的更多相关文章

  1. Django分页器的设置

    Django分页器的设置 有时候在页面中数据有多条时很显然需要进行分页显示,那么在python中django可以这样设置一个分页处理 怎么样去设置呢? 我们要用到  Django  中的  Pagin ...

  2. Django 分页器的使用

    Django 分页器的使用 Django作为Python Web开发框架的一哥,提供了企业级网站开发所需要的几乎所有功能,其中就包括自带分页功能.利用Django自带的Paginator类,我们可以很 ...

  3. Django分页器和自定义分页器

    一.自定义分页器 import copy class Pagination(): def __init__(self,request,current_page,all_data_num,each_pa ...

  4. django -----分页器组件

    分页器组件 本文目录 1 Django的分页器(paginator)简介 2 应用View层 3 模版层 index.html 4 扩展 回到目录 1 Django的分页器(paginator)简介 ...

  5. Django 2.0 学习(19):Django 分页器

    Django 分页器 要使用Django实现分页功能,必须从Django中导入Paginator模块(painator - 分页器) views.py from django.shortcuts im ...

  6. Django - Cookie、Session、自定义分页和Django分页器

    2. 今日内容 https://www.cnblogs.com/liwenzhou/p/8343243.html 1. Cookie和Session 1. Cookie 服务端: 1. 生成字符串 2 ...

  7. Django 分页器 缓存 信号 序列化

    阅读目录 分页器 缓存 信号 序列化 Django分页器  (paginator) 导入 from django.core.paginator import Paginator, EmptyPage, ...

  8. 7.Django|分页器

    Django的分页器paginator 文件为pageDemo models.py from django.db import models # Create your models here. cl ...

  9. 7 Django分页器文章分页

    1.复习 2.这节课要解决的问题? 3.分页的原理 4.准备工作 (1)创建Django项目 C:\Users\Administrator\Desktop\root3>django-admin ...

随机推荐

  1. #022 Python 实验课

    拍7游戏 描述 “拍7游戏”规则是:一堆人围成一圈,开始时,任意指定一人说出数字“1”后,一圈人按顺时针方向,每人按整数由小到大的顺序一人一个地报出后续数字“2”.“3”......,当遇到为“7”的 ...

  2. c#语法学习

    自动属性.隐试类型.命名参数和自动初始化器. note:这里说的这些,是语法糖.按照一定的格式写,部分代码编译器帮我们实现了, 1.自动属性:自动属性是非常有用的语法糖,帮我我们做了两件事:1.自动帮 ...

  3. nginx日志切割(logrotate或shell脚本)

    nginx自己不会对日志文件进行切割,可以通过两种不同的方式进行,分别是:通过logrotate和通过shell脚本. 如果是yum方式安装的nginx,系统默认会自动通过logrotate这个日志管 ...

  4. vue 应用生产环境的 webpack 打包配置优化

    转:https://blog.csdn.net/robin_star_/article/details/83856363 前言:很好的打包优化的帖子,还没来的急去实测验证 1. 去掉 console ...

  5. Linux运维基础

    一.服务器硬件 二.Linux的发展史 三.Linux的系统安装和配置 四.Xshell的安装和优化 五.远程连接排错 六.Linux命令初识 七.Linux系统初识与优化 八.Linux目录结构 九 ...

  6. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  7. centos7下kubernetes(13。kubernetes-探讨service IP)

    service cluster IP是一个虚拟IP,是由kubernetes节点上的iptables规则管理的 通过iptables-save | grep 10.105.215.156看到与clus ...

  8. Kafka 详解(二)------集群搭建

    这里通过 VMware ,我们安装了三台虚拟机,用来搭建 kafka集群,虚拟机网络地址如下: hostname                      ipaddress             ...

  9. rocketmq 4.4部署安装

    官网下载:rocketmq-all-4.4.0-bin-release.zip 准备环境:centos7.6 Maven Java8+ 操作: 在工作目录中进行如下操作: /home/software ...

  10. openstack搭建之-keystone配置(8)

    一. Base Node配置 mysql -uroot -proot CREATE DATABASE keystone GRANT ALL PRIVILEGES ON keystone.* to 'k ...