Python之路【第三十二篇】:django 分页器
Django的分页器paginator
文件为pageDemo
models.py
from django.db import models # Create your models here.
class Book(models.Model):
title = models.CharField(max_length=32)
price = models.DecimalField(decimal_places=2, max_digits=8)
views.py
from django.shortcuts import render # Create your views here.
from .models import Book
from django.core.paginator import Paginator, EmptyPage
def index(request):
'''
批量导入: #批量导入数据库文件里边
book_list = []
for i in range(100):
book = Book(title="book_%s"%i, price=i*i) #实例化一个book对象;
book_list.append(book) #实例化出100个对象;
Book.objects.bulk_create(book_list) #批量插入
return render(request, "index.html")
:param request:
:return:
'''
book_list = Book.objects.all() #拿到所有书籍数据
#分页器
paginator = Paginator(book_list, 8) #对谁分页,一页显示多少条数据 总的分页器对象
print("count:",paginator.count) #数据总数 打印:count:100
print("num_pages",paginator.num_pages) #总页数 num_pages:13
print("page_range",paginator.page_range) #页码的列表 page_range range(1,14) try: #page数字超了或者不在那个返回里就会抛出一个EmptyPage的错误
current_page_num = int(request.GET.get("page", 1)) #做成一个动态的效果。给它个默认值拿第一页,不加1就会返回一个None。当前想要的第几页的数据
current_page = paginator.page(current_page_num) #拿到第几页的page对象。
#显示某一页具体数据的两种方式:
print("object_list", current_page.object_list)
for i in current_page:
print(i)
except EmptyPage as e:
current_page=paginator.page(1) #拿到第一页的page对象
return render(request, "index.html", locals())
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
</head>
<body>
<ul>
{% for book in current_page %}
<li>{{ book.title }}:{{ book.price }}</li>
{% endfor %}
</ul> <nav aria-label="Page navigation"> //分页的页面
<ul class="pagination">
{% if current_page.has_previous %} //上一页:当前页码-1 ---> href="?page={{current_page_num|add:-1}}或者下面这种写法 ;判断当前页是否还有上一页、下一页
<li><a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li> //没有上一页就不
{% endif %} {% for item in paginator.page_range %} //item为数字 这里不该写死-->page_range
{% if current_page_num == item %}
<li class="active"><a href="?page={{ item }}">{{ item }}</a></li> //也当前页码匹配成功了,加个class="active" 一点击谁颜色就会变深
{% else %}
<li><a href="?page={{ item }}">{{ item }}</a></li>
{% endif %}
{% endfor %} {% if current_page.has_next %}
<li><a href="?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% else %}
<li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
{% endif %} </ul>
</nav>
</body>
</html>
改进版
views
from django.shortcuts import render # Create your views here.
from .models import Book
from django.core.paginator import Paginator, EmptyPage
def index(request):
'''
批量导入:
book_list = []
for i in range(100):
book = Book(title="book_%s"%i, price=i*i)
book_list.append(book)
Book.objects.bulk_create(book_list) #匹配插入
return render(request, "index.html")
:param request:
:return:
'''
book_list = Book.objects.all()
#分页器
paginator = Paginator(book_list, 3)
print("count:",paginator.count) #数据总数
print("num_pages",paginator.num_pages) #总页数
print("page_range",paginator.page_range) #页码的列表 current_page_num = int(request.GET.get("page", 1))
if paginator.num_pages>11:
if current_page_num-5 < 1: ##点1、2、3、4、5页码不动,点7开始显示左5右5
page_range = range(1, 12)
elif current_page_num+5 > paginator.num_pages: #如果大于最大页码数
page_range = range(paginator.num_pages-10, paginator.num_pages+1)
else: else:
current_page = paginator.page_range try:
current_page_num = int(request.GET.get("page", 1))
current_page = paginator.page(current_page_num)
#显示某一页具体数据的两种方式:
print("object_list", current_page.object_list)
for i in current_page:
print(i)
except EmptyPage as e:
current_page=paginator.page(1)
return render(request, "index.html", locals())
index.html
{% for item in page_range %} 不应该写死,其他同上
{% if current_page_num == item %}
<li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
{% else %}
<li><a href="?page={{ item }}">{{ item }}</a></li>
{% endif %}
{% endfor %}
Python之路【第三十二篇】:django 分页器的更多相关文章
- 【Python之路】第二十二篇--Django【基础篇】
1 Django流程介绍 MTV模式 著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...
- Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输
一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...
- Python之路【第十二篇】:JavaScrpt -暂无内容-待更新
Python之路[第十二篇]:JavaScrpt -暂无内容-待更新
- Python之路【第十二篇】:Python面向对象高级
一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...
- Python之路【第二十二篇】CMDB项目
浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...
- Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞
一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...
- Python之路【第十二篇续】jQuery案例详解
jQuery 1.jQuery和JS和HTML的关系 首先了HTML是实际展示在用户面前的用户可以直接体验到的,JS是操作HTML的他能改变HTML实际展示给用户的效果! 首先了解JS是一门语言,他是 ...
- Python之路【第二十二篇】:Django之Model操作
Django之Model操作 一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...
- Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型
一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...
- python之路【第十二篇】: MYSQL
一. 概述 Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...
随机推荐
- python3.6安装PyUserInput
python3.6安装PyUserInput https://www.cnblogs.com/yoyoketang/p/8043814.html
- c# 使用T4模板生成实体类(sqlserver)
新建类库,右键添加 "文本模板" 添加完成之后生成如下后缀为 tt的文件: 双击文件:TextTemplate_Test.tt 文件打开,替换代码如下 <#@ templat ...
- JS DOM属性+JS事件
DOM属性 console.log(ele.attributes) 获取ele元素的属性集合 ele.attributes.getNamesItem(attr).nodeValue 获取指定属性值 e ...
- HTML5表单验证(4个实用的表单美化案例)
multipart/form-data 在使用包含文件上传控件的表单时,必须使用autocomplete="on" 自动补全功能novalidate 不验证 <form en ...
- 对vulnhub靶机lampiao的getshell到脏牛提权获取flag
前言: vulnhub里面的一个靶场,涉及到drupal7 cms远程代码执行漏洞(CVE-2018-7600)和脏牛提权. 靶机下载地址:https://mega.nz/#!aG4AAaDB!CBL ...
- LOJ#508. 「LibreOJ NOI Round #1」失控的未来交通工具
题意 一个带边权无向图,有两种操作:加边以及询问在\(x,x+b,...,x+(c-1)b\)这些数中,有多少个数存在至少一条与之模\(m\)同余的从\(u\)到\(v\)的路径(可以不是简单路径). ...
- 0级搭建类014-Red Hat Enterprise Linux 7.6 安装
RHEL 7.6 操作系统安装 这个很简单的嘛?有什么好讲的?
- .Net Core 智能提示汉化包
在.Net Core 2.x 版本,Microsoft 官方没有提供 .Net Core 正式版的多语言安装包.因此,我们在用.Net Core 2.x 版本作为框架目标编写代码时,智能提成是英文的. ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- 551-学生出勤记录 I
551-学生出勤记录 I 给定一个字符串来代表一个学生的出勤记录,这个记录仅包含以下三个字符: 'A' : Absent,缺勤 'L' : Late,迟到 'P' : Present,到场 如果一个学 ...