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

分页器的使用

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. 无post按钮提交表单

    <form id="form1" name="form" action="url" method="GET"> ...

  2. git -分支管理(创建、推送、删除)

    分支创建并推送: 1.查看当前所有分支,当前分支前面会标出一个*号 git branch -a 2.新建分支 git branch android_O 3.切换到新分支 git checkout an ...

  3. c++面经积累<2>

    4.类成员初始化方式:列表初始化和赋值初始化 赋值初始化通过在函数体内进行赋值,列表初始化,在构造函数后面加上冒号,使用初始化列表进行初始化.在函数体内进行初始化,是在所有的数据成员被分配内存空间后进 ...

  4. ORM杂记

    1.反射练习 import sys class Person(object): def __init__(self, name): self.name = name def eat(self, foo ...

  5. maven 发布快照版本后的引用

    使用nexus发布快照版本后, 引用项目问题 必须 <scope>test</scope> 才能引用快照.releases 不受此限制

  6. linux测速工具 speedtest-cli

    安装speedtest-cli: wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/ ...

  7. c++ fmt 库安装和使用示例

    安装: 1 git clone  https://github.com/fmtlib/fmt.git 2. cmake . 3. make && make install  #incl ...

  8. Kubernetes一键部署利器:kubeadm

    要真正发挥容器技术的实力,你就不能仅仅局限于对 Linux 容器本身的钻研和使用. 这些知识更适合作为你的技术储备,以便在需要的时候可以帮你更快的定位问题,并解决问题. 而更深入的学习容器技术的关键在 ...

  9. Uint 5.css继承权重,盒模型和border padding

    一 .css的继承性和权重 1.1 继承性:继承是CSS的一个主要特征,它是依赖于祖先-后代的关系的.继承是一种机制,它允许样式不仅可以应用于某个特定的元素,还可以应用于它的后代. 可以被继承的属性有 ...

  10. 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)

    产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...