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 ...
随机推荐
- yuan 老师 之 Django
前端: 1.前端基础之JavaScript https://www.cnblogs.com/yuanchenqi/articles/6893904.html 2.前端基础之jQuery https:/ ...
- WINFORM因为 线程崩溃
1.如果WinForm程序中使用了线程,而线程调用的代码中会抛出异常,该异常没有任何Try块处理.就会导致程序从主线程中跳出,导致WinForm程序突然崩溃性关闭.2.程序读写某些外部资源,比如数据库 ...
- Dockerfile 规范
https://time-track.cn/compile-docker-from-source.html 参考 https://time-track.cn/install-docker-on-ubu ...
- Python排序算法——冒泡排序
有趣的事,Python永远不会缺席! 如需转发,请注明出处:小婷儿的python https://www.cnblogs.com/xxtalhr/p/10786904.html 一.冒泡排序(Bubb ...
- JDK1.8源码(十)——java.util.LinkedHashSet类
同 HashSet 与 HashMap 的关系一样,本篇博客所介绍的 LinkedHashSet 和 LinkedHashMap 也是一致的.在 JDK 集合框架中,类似 Set 集合通常都是由对应的 ...
- python 枚举Enum
常量是任何一门语言中都会使用的一种变量类型 如 要表示星期常量,我们可能会直接定义一组变量 JAN = 1 TWO = 2 ... 然后在返回给前端的时候,我们返回的就会是1,2,...这种魔法数字, ...
- 分治FFT的三种含义
分治FFT是几个算法的统称.它们之间并无关联. 分治多项式乘法 问题如求\(\prod_{i=1}^na_ix+b\). 若挨个乘复杂度为\(O(n^2\log n)\),可分治做这件事,复杂度为\( ...
- delete *p可以替代delete[] p吗?
在stackoverflow看到一个标题描述的问题,问题链接是:https://stackoverflow.com/questions/55524140/is-delete-p-an-alternat ...
- URL https://i.cnblogs.com/EditPosts.aspx?opt=1
URL url = new URL("https://i.cnblogs.com");URL url1 = new URL(url, "EditPosts.aspx?op ...
- SaxReader读取xml
package com.java1234.action; import java.io.File; import java.util.List; import org.dom4j.Document; ...