http://www.mamicode.com/info-detail-1724597.html

http://www.cnblogs.com/wupeiqi/articles/5246483.html

  1. 分页组件
  2. - Django内置分页
  3. - Paginator Page
  4. - 页面:include
  5.  
  6. - 扩展Django的内置分页
  7. - CustomPaginator(Paginator)
  8. 传入:
  9. - 所有数据
  10. - 当前页
  11. - 每页显示30
  12. - 最多页面7
  13.  
  14. - 自定义分页
  15. 传入:
  16. - 所有数据的个数
  17. - 当前页
  18. - 每页显示30
  19. - 最多页面7

Django内置分页

  1. from django.shortcuts import render
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. L = []
  5. for i in range(999):
  6. L.append(i)
  7.  
  8. def index(request):
  9. current_page = request.GET.get('p')
  10.  
  11. paginator = Paginator(L, 10)
  12. # per_page: 每页显示条目数量
  13. # count: 数据总个数
  14. # num_pages:总页数
  15. # page_range:总页数的索引范围,如: (1,10),(1,200)
  16. # page: page对象
  17. try:
  18. posts = paginator.page(current_page)
  19. # has_next 是否有下一页
  20. # next_page_number 下一页页码
  21. # has_previous 是否有上一页
  22. # previous_page_number 上一页页码
  23. # object_list 分页之后的数据列表
  24. # number 当前页
  25. # paginator paginator对象
  26. except PageNotAnInteger:
  27. posts = paginator.page(1)
  28. except EmptyPage:
  29. posts = paginator.page(paginator.num_pages)
  30. return render(request, 'index.html', {'posts': posts})
  31.  
  32. views.py

views

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <ul>
  9. {% for item in posts %}
  10. <li>{{ item }}</li>
  11. {% endfor %}
  12. </ul>
  13.  
  14. <div class="pagination">
  15. <span class="step-links">
  16. {% if posts.has_previous %}
  17. <a href="?p={{ posts.previous_page_number }}">Previous</a>
  18. {% endif %}
  19. <span class="current">
  20. Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
  21. </span>
  22. {% if posts.has_next %}
  23. <a href="?p={{ posts.next_page_number }}">Next</a>
  24. {% endif %}
  25. </span>
  26.  
  27. </div>
  28. </body>
  29. </html>
  30.  
  31. Html

html

扩展内置分页

  1. from django.shortcuts import render
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. class CustomPaginator(Paginator):
  5. def __init__(self, current_page, max_pager_num, *args, **kwargs):
  6. """
  7. :param current_page: 当前页
  8. :param max_pager_num:最多显示的页码个数
  9. :param args:
  10. :param kwargs:
  11. :return:
  12. """
  13. self.current_page = int(current_page)
  14. self.max_pager_num = max_pager_num
  15. super(CustomPaginator, self).__init__(*args, **kwargs)
  16.  
  17. def page_num_range(self):
  18. # 当前页面
  19. # self.current_page
  20. # 总页数
  21. # self.num_pages
  22. # 最多显示的页码个数
  23. # self.max_pager_num
  24. print(1)
  25. if self.num_pages < self.max_pager_num:
  26. return range(1, self.num_pages + 1)
  27. print(2)
  28. part = int(self.max_pager_num / 2)
  29. if self.current_page - part < 1:
  30. return range(1, self.max_pager_num + 1)
  31. print(3)
  32. if self.current_page + part > self.num_pages:
  33. return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
  34. print(4)
  35. return range(self.current_page - part, self.current_page + part + 1)
  36.  
  37. L = []
  38. for i in range(999):
  39. L.append(i)
  40.  
  41. def index(request):
  42. current_page = request.GET.get('p')
  43. paginator = CustomPaginator(current_page, 11, L, 10)
  44. # per_page: 每页显示条目数量
  45. # count: 数据总个数
  46. # num_pages:总页数
  47. # page_range:总页数的索引范围,如: (1,10),(1,200)
  48. # page: page对象
  49. try:
  50. posts = paginator.page(current_page)
  51. # has_next 是否有下一页
  52. # next_page_number 下一页页码
  53. # has_previous 是否有上一页
  54. # previous_page_number 上一页页码
  55. # object_list 分页之后的数据列表
  56. # number 当前页
  57. # paginator paginator对象
  58. except PageNotAnInteger:
  59. posts = paginator.page(1)
  60. except EmptyPage:
  61. posts = paginator.page(paginator.num_pages)
  62.  
  63. return render(request, 'index.html', {'posts': posts})

Views.py

  1. <!DOCTYPE html>
  2. <html>
  3. <head lang="en">
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8.  
  9. <ul>
  10. {% for item in posts %}
  11. <li>{{ item }}</li>
  12. {% endfor %}
  13. </ul>
  14.  
  15. <div class="pagination">
  16. <span class="step-links">
  17. {% if posts.has_previous %}
  18. <a href="?p={{ posts.previous_page_number }}">Previous</a>
  19. {% endif %}
  20.  
  21. {% for i in posts.paginator.page_num_range %}
  22. <a href="?p={{ i }}">{{ i }}</a>
  23. {% endfor %}
  24.  
  25. {% if posts.has_next %}
  26. <a href="?p={{ posts.next_page_number }}">Next</a>
  27. {% endif %}
  28. </span>
  29.  
  30. <span class="current">
  31. Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
  32. </span>
  33.  
  34. </div>
  35. </body>
  36. </html>

扩展内置分页:Html

使用模板include

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8.  
  9. <ul>
  10. {% for row in posts.object_list %}
  11. <li>{{ row.name }}-{{ row.age }}</li>
  12. {% endfor %}
  13. </ul>
  14. {% include 'include/pager.html' %}
  15. </body>
  16. </html>

index

  1. {% if posts.has_previous %}
  2. <a href="/index?p={{ posts.previous_page_number }}">up</a>
  3. {% else %}
  4. <a href="#">up</a>
  5. {% endif %}
  6.  
  7. {% for i in posts.paginator.pager_num_range %}
  8. {% if i == posts.number %}
  9. <a style="font-size: 30px;" href="/index?p={{ i }}">{{ i }}</a>
  10. {% else %}
  11. <a href="/index?p={{ i }}">{{ i }}</a>
  12. {% endif %}
  13. {% endfor %}
  14.  
  15. {% if posts.has_next %}
  16. <a href="/index?p={{ posts.next_page_number }}">down</a>
  17. {% else %}
  18. <a href="#">down</a>
  19. {% endif %}
  20.  
  21. <span>
  22. {{ posts.number }}/{{ posts.paginator.num_pages }}
  23. </span>

pager.html

自定义分页

分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该在数据库表中的起始位置。

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...)

3、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

4、在数据表中根据起始位置取值,页面上输出数据


需求又来了,需要在页面上显示分页的页面。如:[上一页][1][2][3][4][5][下一页]

1、设定每页显示数据条数

2、用户输入页码(第一页、第二页...)

3、设定显示多少页号

4、获取当前数据总条数

5、根据设定显示多少页号和数据总条数计算出,总页数

6、根据设定的每页显示条数和当前页码,计算出需要取数据表的起始位置

7、在数据表中根据起始位置取值,页面上输出数据

8、输出分页html,如:[上一页][1][2][3][4][5][下一页]

  1. from django.shortcuts import render
  2. from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
  3.  
  4. USER_LIST = []
  5. for i in range(1,666):
  6. temp = {'name':'root'+str(i), 'age':i}
  7. USER_LIST.append(temp)
  8.  
  9. def index2(request):
  10. from app01.pager import Pagination
  11. current_page = request.GET.get('p')
  12. page_obj = Pagination(666,current_page)
  13.  
  14. data_list = USER_LIST[page_obj.start():page_obj.end()]
  15. return render(request,'index2.html',{'data':data_list,'page_obj':page_obj})

views.py

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css" />
  7. </head>
  8. <body>
  9. <ul>
  10. {% for row in data %}
  11. <li>{{ row.name }}-{{ row.age }}</li>
  12. {% endfor %}
  13. </ul>
  14. {% for i in page_obj.pager_num_range %}
  15. <a href="/index2.html?p={{ i }}">{{ i }}</a>
  16. {% endfor %}
  17. <hr/>
  18.  
  19. <ul class="pagination pagination-sm">
  20. {{ page_obj.page_str|safe }}
  21. </ul>
  22. <div style="height: 300px;"></div>
  23. </body>
  24. </html>

index2

  1. class Pagination(object):
  2. def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7):
  3. # 数据总个数
  4. self.total_count = totalCount
  5. # 当前页
  6. try:
  7. v = int(currentPage)
  8. if v <= 0:
  9. v = 1
  10. self.current_page = v
  11. except Exception as e:
  12. self.current_page = 1
  13. # 每页显示的行数
  14. self.per_page_item_num = perPageItemNum
  15. # 最多显示页面
  16. self.max_page_num = maxPageNum
  17.  
  18. def start(self):
  19. return (self.current_page-1) * self.per_page_item_num
  20.  
  21. def end(self):
  22. return self.current_page * self.per_page_item_num
  23. @property
  24. def num_pages(self):
  25. """
  26. 总页数
  27. :return:
  28. """
  29. #
  30. #
  31. a,b = divmod(self.total_count,self.per_page_item_num)
  32. if b == 0:
  33. return a
  34. return a+1
  35.  
  36. def pager_num_range(self):
  37. # self.num_pages()
  38. # self.num_pages
  39. # 当前页
  40. #self.current_page
  41. # 最多显示的页码数量 11
  42. #self.per_pager_num
  43. # 总页数
  44. # self.num_pages
  45. if self.num_pages < self.max_page_num:
  46. return range(1,self.num_pages+1)
  47. # 总页数特别多 5
  48. part = int(self.max_page_num/2)
  49. if self.current_page <= part:
  50. return range(1,self.max_page_num+1)
  51. if (self.current_page + part) > self.num_pages:
  52. return range(self.num_pages-self.max_page_num+1,self.num_pages+1)
  53. return range(self.current_page-part,self.current_page+part+1)
  54.  
  55. def page_str(self):
  56. page_list = []
  57.  
  58. first = "<li><a href='/index2.html?p=1'>首页</a></li>"
  59. page_list.append(first)
  60.  
  61. if self.current_page == 1:
  62. prev = "<li><a href='#'>上一页</a></li>"
  63. else:
  64. prev = "<li><a href='/index2.html?p=%s'>上一页</a></li>" %(self.current_page-1,)
  65. page_list.append(prev)
  66. for i in self.pager_num_range():
  67. if i == self.current_page:
  68. temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>" %(i,i)
  69. else:
  70. temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
  71. page_list.append(temp)
  72.  
  73. if self.current_page == self.num_pages:
  74. nex = "<li><a href='#'>下一页</a></li>"
  75. else:
  76. nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
  77. page_list.append(nex)
  78.  
  79. last = "<li><a href='/index2.html?p=%s'>尾页</a></li>" %(self.num_pages,)
  80. page_list.append(last)
  81.  
  82. return ''.join(page_list)

pager.py

总结,分页时需要做三件事:

  • 创建处理分页数据的类
  • 根据分页数据获取数据
  • 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]

Django(十四)分页器(paginator)及自定义分页D的更多相关文章

  1. Django之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  2. Python自动化运维 - Django(二)Ajax基础 - 自定义分页

    Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...

  3. 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式

    [.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...

  4. python第十四课--排序及自定义函数之自定义函数(案例五)

    演示函数的定义和使用细节: 默认参数:#在设计自定义函数的时候,就存在一个默认值,就算在调用的时候不显示的传入实参,也不会报错.#会用默认值来代替参与后期的运算 def m1(name='张三',ag ...

  5. python第十四课--排序及自定义函数之自定义函数(案例四)

    整理:4中最常见的自定义函数模型1).无参无返回值2).无参有返回值3).有参无返回值4).有参有返回值 #定义无参无返回值自定义函数 def func1(): print('hello method ...

  6. python第十四课--排序及自定义函数之自定义函数(案例二)

    案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...

  7. python第十四课--排序及自定义函数之自定义函数(案例一)

    案例一: 演示自定义函数的使用:包含:1).定义格式的掌握2).函数的好处 自定义函数:实现打印矩形的操作两个原则需要考虑:1).有没有形参?有,2个 2).有没有返回值?没有. def printR ...

  8. python第十四课--排序及自定义函数之案例二:冒泡排序

    案例二:冒泡排序 lt1=[45,12,56,-32,-3,44,75,-22,100] print('排序前:'+str(lt1)) 自定义函数:实现冒泡排序(升序)原则:1).有没有形参?有,接受 ...

  9. python第十四课--排序及自定义函数

    1.排序 特点: 1).升序:从小到大 2).降序:从大到小 课堂实现选择排序:参看老郭选择排序.py文件 2.函数:(方法/method) 自定义函数: 概念:它表示一段作用范围(作用域),当中封装 ...

  10. Vue.js 源码分析(十四) 基础篇 组件 自定义事件详解

    我们在开发组件时有时需要和父组件沟通,此时可以用自定义事件来实现 组件的事件分为自定义事件和原生事件,前者用于子组件给父组件发送消息的,后者用于在组件的根元素上直接监听一个原生事件,区别就是绑定原生事 ...

随机推荐

  1. python之路--字典

    一. 字典 字典是以key:value的形式来保存数据的,用{}表示 字典的增删改查 字典的增加 dic = {"意大利": "李云龙", "美国&q ...

  2. Node & CLI

    Node & CLI cli 生成文件的原理是什么 https://nodejs.org/api/cli.html http://nodejs.cn/api/cli.html CLI & ...

  3. rand和randn

    1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数 rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可 ...

  4. ES6字符串操作

    讨论字符串操作之前,我们先来了解一下Unicode 编码的由来,因为Js中的字符串就是一系列Unicode码的集合. 我们都知道,世界上存在着各种各样的语言,汉语,英语,日语等,相对应的,也就存在各种 ...

  5. Nginx 慢启动与拥塞窗口

    L:127

  6. ElasticSearch原理

    Elasticsearch-基础介绍及索引原理分析 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearc ...

  7. Redis宕机的问题

    在主从模式下宕机要分为区分来看: slave从redis宕机 ​ 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据: ​ 如果从数据库实现了持久化,只要重新假如到主从架构中会实现增 ...

  8. LitJson的用法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  9. Codeforces Round #429 Div. 1

    A:甚至连题面都不用仔细看,看一下样例就知道是要把大的和小的配对了. #include<iostream> #include<cstdio> #include<cmath ...

  10. pip 使用

    PIP的使用 作用 管理python的标准第三方库 安装 sudo apt-get install python3-pip 常用命令 [1] 安装软件包 pip3 install [package] ...