Django的分页器paginator

文件为pageDemo

models.py

  1. from django.db import models
  2.  
  3. # Create your models here.
  4. class Book(models.Model):
  5. title = models.CharField(max_length=32)
  6. price = models.DecimalField(decimal_places=2, max_digits=8)

views.py

  1. from django.shortcuts import render
  2.  
  3. # Create your views here.
  4. from .models import Book
  5. from django.core.paginator import Paginator, EmptyPage
  6. def index(request):
  7. '''
  8. 批量导入: #批量导入数据库文件里边
  9. book_list = []
  10. for i in range(100):
  11. book = Book(title="book_%s"%i, price=i*i) #实例化一个book对象;
  12. book_list.append(book) #实例化出100个对象;
  13. Book.objects.bulk_create(book_list) #批量插入
  14. return render(request, "index.html")
  15. :param request:
  16. :return:
  17. '''
  18. book_list = Book.objects.all() #拿到所有书籍数据
  19. #分页器
  20. paginator = Paginator(book_list, 8) #对谁分页,一页显示多少条数据 总的分页器对象
  21. print("count:",paginator.count) #数据总数 打印:count:100
  22. print("num_pages",paginator.num_pages) #总页数     num_pages:13
  23. print("page_range",paginator.page_range) #页码的列表    page_range range(1,14)
  24.  
  25. try: #page数字超了或者不在那个返回里就会抛出一个EmptyPage的错误
  26. current_page_num = int(request.GET.get("page", 1)) #做成一个动态的效果。给它个默认值拿第一页,不加1就会返回一个None。当前想要的第几页的数据
  27. current_page = paginator.page(current_page_num) #拿到第几页的page对象。
  28. #显示某一页具体数据的两种方式:
  29. print("object_list", current_page.object_list)
  30. for i in current_page:
  31. print(i)
  32. except EmptyPage as e:
  33. current_page=paginator.page(1) #拿到第一页的page对象
  34. return render(request, "index.html", locals())

index.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
  7. <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
  8. </head>
  9. <body>
  10. <ul>
  11. {% for book in current_page %}
  12. <li>{{ book.title }}:{{ book.price }}</li>
  13. {% endfor %}
  14. </ul>
  15.  
  16. <nav aria-label="Page navigation"> //分页的页面
  17. <ul class="pagination">
  18. {% if current_page.has_previous %} //上一页:当前页码-1 ---> href="?page={{current_page_num|add:-1}}或者下面这种写法 ;判断当前页是否还有上一页、下一页
  19. <li><a href="?page={{ current_page.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li>
  20. {% else %}
  21. <li class="disabled"><a href="" aria-label="Previous"><span aria-hidden="true">上一页</span></a></li> //没有上一页就不
  22. {% endif %}
  23.  
  24. {% for item in paginator.page_range %} //item为数字 这里不该写死-->page_range
  25. {% if current_page_num == item %}
  26. <li class="active"><a href="?page={{ item }}">{{ item }}</a></li> //也当前页码匹配成功了,加个class="active" 一点击谁颜色就会变深
  27. {% else %}
  28. <li><a href="?page={{ item }}">{{ item }}</a></li>
  29. {% endif %}
  30. {% endfor %}
  31.  
  32. {% if current_page.has_next %}
  33. <li><a href="?page={{ current_page.next_page_number }}" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
  34. {% else %}
  35. <li class="disabled"><a href="" aria-label="Next"><span aria-hidden="true">下一页</span></a></li>
  36. {% endif %}
  37.  
  38. </ul>
  39. </nav>
  40. </body>
  41. </html>

改进版

views

  1. from django.shortcuts import render
  2.  
  3. # Create your views here.
  4. from .models import Book
  5. from django.core.paginator import Paginator, EmptyPage
  6. def index(request):
  7. '''
  8. 批量导入:
  9. book_list = []
  10. for i in range(100):
  11. book = Book(title="book_%s"%i, price=i*i)
  12. book_list.append(book)
  13. Book.objects.bulk_create(book_list) #匹配插入
  14. return render(request, "index.html")
  15. :param request:
  16. :return:
  17. '''
  18. book_list = Book.objects.all()
  19. #分页器
  20. paginator = Paginator(book_list, 3)
  21. print("count:",paginator.count) #数据总数
  22. print("num_pages",paginator.num_pages) #总页数
  23. print("page_range",paginator.page_range) #页码的列表
  24.  
  25. current_page_num = int(request.GET.get("page", 1))
  26. if paginator.num_pages>11:
  27. if current_page_num-5 < 1: ##点1、2、3、4、5页码不动,点7开始显示左5右5
  28. page_range = range(1, 12)
  29. elif current_page_num+5 > paginator.num_pages: #如果大于最大页码数
  30. page_range = range(paginator.num_pages-10, paginator.num_pages+1)
  31. else:
  32.  
  33. else:
  34. current_page = paginator.page_range
  35.  
  36. try:
  37. current_page_num = int(request.GET.get("page", 1))
  38. current_page = paginator.page(current_page_num)
  39. #显示某一页具体数据的两种方式:
  40. print("object_list", current_page.object_list)
  41. for i in current_page:
  42. print(i)
  43. except EmptyPage as e:
  44. current_page=paginator.page(1)
  45. return render(request, "index.html", locals())

index.html

  1. {% for item in page_range %} 不应该写死,其他同上
  2. {% if current_page_num == item %}
  3. <li class="active"><a href="?page={{ item }}">{{ item }}</a></li>
  4. {% else %}
  5. <li><a href="?page={{ item }}">{{ item }}</a></li>
  6. {% endif %}
  7. {% endfor %}

Python之路【第三十二篇】:django 分页器的更多相关文章

  1. 【Python之路】第二十二篇--Django【基础篇】

    1 Django流程介绍 MTV模式       著名的MVC模式:所谓MVC就是把web应用分为模型(M),控制器(C),视图(V)三层:他们之间以一种插件似的,松耦合的方式连接在一起. 模型负责业 ...

  2. Python之路(第三十二篇) 网络编程:udp套接字、简单文件传输

    一.UDP套接字 服务端 # udp是无链接的,先启动哪一端都不会报错 # udp没有链接,与tcp相比没有链接循环,只有通讯循环 server = socket.socket(socket.AF_I ...

  3. Python之路【第十二篇】:JavaScrpt -暂无内容-待更新

    Python之路[第十二篇]:JavaScrpt -暂无内容-待更新

  4. Python之路【第十二篇】:Python面向对象高级

    一.反射 1 什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究 ...

  5. Python之路【第二十二篇】CMDB项目

    浅谈ITIL TIL即IT基础架构库(Information Technology Infrastructure Library, ITIL,信息技术基础架构库)由英国政府部门CCTA(Central ...

  6. Python之路(第三十六篇)并发编程:进程、同步异步、阻塞非阻塞

    一.理论基础 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的. 即使可以利用的cpu只有一个(早期的 ...

  7. Python之路【第十二篇续】jQuery案例详解

    jQuery 1.jQuery和JS和HTML的关系 首先了HTML是实际展示在用户面前的用户可以直接体验到的,JS是操作HTML的他能改变HTML实际展示给用户的效果! 首先了解JS是一门语言,他是 ...

  8. Python之路【第二十二篇】:Django之Model操作

    Django之Model操作   一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bi ...

  9. Python之路(第三十八篇) 并发编程:进程同步锁/互斥锁、信号量、事件、队列、生产者消费者模型

    一.进程锁(同步锁/互斥锁) 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理. 例 ...

  10. python之路【第十二篇】: MYSQL

    一. 概述 Mysql是最流行的关系型数据库管理系统,在WEB应用方面MySQL是最好的RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...

随机推荐

  1. 吴裕雄--天生自然 HADOOP大数据分布式处理:安装XShell

    下载安装包

  2. JS基础-内置对象【字符串+Date+Math】

    JS内置对象[字符串] // charAt() 返回字符 // charCodeAt() 返回字符的unicode编码 var str="hello world"; console ...

  3. LeetCode:27 移除元素

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  4. 洛谷 P4708 画画

    题意 在所以置换下,本质不同的各个极大连通子图均含有欧拉闭迹的\(n\)阶图个数 做法 务必先做完这题再看此题解,因为会省略大部分分析了 仍是从边入手,隔外限制:各个点度数是偶数 某个因子内\((m= ...

  5. LeetCode 112. 路径总和 (递归遍历二叉树)

    题目链接:https://leetcode-cn.com/problems/path-sum/ 给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和 ...

  6. day03_2spring3

    SSH整合(续) 一.spring整合hibernate:有hibernate.cfg.xml 前提:导入jar包,在前面已经介绍了jar包的整合,我们只需要将整合的所有jar包导进去即可. 1.创建 ...

  7. Hdu2097 Sky数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2097 Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶 ...

  8. Codeforce 567A - Lineland Mail

    All cities of Lineland are located on the Ox coordinate axis. Thus, each city is associated with its ...

  9. Graph Regularized Feature Selection with Data Reconstruction

    Abstract • 从图正则数据重构方面处理无监督特征选择: • 模型的思想是所选特征不仅通过图正则保留了原始数据的局部结构,也通过线性组合重构了每个数据点: • 所以重构误差成为判断所选特征质量的 ...

  10. BK: How to read a book 第一篇

    第一章 阅读的活力与艺术 主动阅读 VS 被动阅读(新闻媒体) 作者与读者:投手与捕手的关系. 阅读的目标: 为获得资讯而读,以及为求得理解而读. 为获得咨讯而读,不会增加我们的理解力.比如阅读报纸, ...