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:关系数据库管理系统)应用 ...
随机推荐
- 吴裕雄--天生自然 HADOOP大数据分布式处理:安装XShell
下载安装包
- JS基础-内置对象【字符串+Date+Math】
JS内置对象[字符串] // charAt() 返回字符 // charCodeAt() 返回字符的unicode编码 var str="hello world"; console ...
- LeetCode:27 移除元素
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- 洛谷 P4708 画画
题意 在所以置换下,本质不同的各个极大连通子图均含有欧拉闭迹的\(n\)阶图个数 做法 务必先做完这题再看此题解,因为会省略大部分分析了 仍是从边入手,隔外限制:各个点度数是偶数 某个因子内\((m= ...
- LeetCode 112. 路径总和 (递归遍历二叉树)
题目链接:https://leetcode-cn.com/problems/path-sum/ 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 ...
- day03_2spring3
SSH整合(续) 一.spring整合hibernate:有hibernate.cfg.xml 前提:导入jar包,在前面已经介绍了jar包的整合,我们只需要将整合的所有jar包导进去即可. 1.创建 ...
- Hdu2097 Sky数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2097 Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶 ...
- Codeforce 567A - Lineland Mail
All cities of Lineland are located on the Ox coordinate axis. Thus, each city is associated with its ...
- Graph Regularized Feature Selection with Data Reconstruction
Abstract • 从图正则数据重构方面处理无监督特征选择: • 模型的思想是所选特征不仅通过图正则保留了原始数据的局部结构,也通过线性组合重构了每个数据点: • 所以重构误差成为判断所选特征质量的 ...
- BK: How to read a book 第一篇
第一章 阅读的活力与艺术 主动阅读 VS 被动阅读(新闻媒体) 作者与读者:投手与捕手的关系. 阅读的目标: 为获得资讯而读,以及为求得理解而读. 为获得咨讯而读,不会增加我们的理解力.比如阅读报纸, ...