Django(十四)分页器(paginator)及自定义分页D
http://www.mamicode.com/info-detail-1724597.html
http://www.cnblogs.com/wupeiqi/articles/5246483.html
- 分页组件
- - Django内置分页
- - Paginator、 Page
- - 页面:include
- - 扩展Django的内置分页
- - CustomPaginator(Paginator)
- 传入:
- - 所有数据
- - 当前页
- - 每页显示30条
- - 最多页面7个
- - 自定义分页
- 传入:
- - 所有数据的个数
- - 当前页
- - 每页显示30条
- - 最多页面7个
Django内置分页
- from django.shortcuts import render
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- L = []
- for i in range(999):
- L.append(i)
- def index(request):
- current_page = request.GET.get('p')
- paginator = Paginator(L, 10)
- # per_page: 每页显示条目数量
- # count: 数据总个数
- # num_pages:总页数
- # page_range:总页数的索引范围,如: (1,10),(1,200)
- # page: page对象
- try:
- posts = paginator.page(current_page)
- # has_next 是否有下一页
- # next_page_number 下一页页码
- # has_previous 是否有上一页
- # previous_page_number 上一页页码
- # object_list 分页之后的数据列表
- # number 当前页
- # paginator paginator对象
- except PageNotAnInteger:
- posts = paginator.page(1)
- except EmptyPage:
- posts = paginator.page(paginator.num_pages)
- return render(request, 'index.html', {'posts': posts})
- views.py
views
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title></title>
- </head>
- <body>
- <ul>
- {% for item in posts %}
- <li>{{ item }}</li>
- {% endfor %}
- </ul>
- <div class="pagination">
- <span class="step-links">
- {% if posts.has_previous %}
- <a href="?p={{ posts.previous_page_number }}">Previous</a>
- {% endif %}
- <span class="current">
- Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
- </span>
- {% if posts.has_next %}
- <a href="?p={{ posts.next_page_number }}">Next</a>
- {% endif %}
- </span>
- </div>
- </body>
- </html>
- Html
html
扩展内置分页
- from django.shortcuts import render
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- class CustomPaginator(Paginator):
- def __init__(self, current_page, max_pager_num, *args, **kwargs):
- """
- :param current_page: 当前页
- :param max_pager_num:最多显示的页码个数
- :param args:
- :param kwargs:
- :return:
- """
- self.current_page = int(current_page)
- self.max_pager_num = max_pager_num
- super(CustomPaginator, self).__init__(*args, **kwargs)
- def page_num_range(self):
- # 当前页面
- # self.current_page
- # 总页数
- # self.num_pages
- # 最多显示的页码个数
- # self.max_pager_num
- print(1)
- if self.num_pages < self.max_pager_num:
- return range(1, self.num_pages + 1)
- print(2)
- part = int(self.max_pager_num / 2)
- if self.current_page - part < 1:
- return range(1, self.max_pager_num + 1)
- print(3)
- if self.current_page + part > self.num_pages:
- return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
- print(4)
- return range(self.current_page - part, self.current_page + part + 1)
- L = []
- for i in range(999):
- L.append(i)
- def index(request):
- current_page = request.GET.get('p')
- paginator = CustomPaginator(current_page, 11, L, 10)
- # per_page: 每页显示条目数量
- # count: 数据总个数
- # num_pages:总页数
- # page_range:总页数的索引范围,如: (1,10),(1,200)
- # page: page对象
- try:
- posts = paginator.page(current_page)
- # has_next 是否有下一页
- # next_page_number 下一页页码
- # has_previous 是否有上一页
- # previous_page_number 上一页页码
- # object_list 分页之后的数据列表
- # number 当前页
- # paginator paginator对象
- except PageNotAnInteger:
- posts = paginator.page(1)
- except EmptyPage:
- posts = paginator.page(paginator.num_pages)
- return render(request, 'index.html', {'posts': posts})
Views.py
- <!DOCTYPE html>
- <html>
- <head lang="en">
- <meta charset="UTF-8">
- <title></title>
- </head>
- <body>
- <ul>
- {% for item in posts %}
- <li>{{ item }}</li>
- {% endfor %}
- </ul>
- <div class="pagination">
- <span class="step-links">
- {% if posts.has_previous %}
- <a href="?p={{ posts.previous_page_number }}">Previous</a>
- {% endif %}
- {% for i in posts.paginator.page_num_range %}
- <a href="?p={{ i }}">{{ i }}</a>
- {% endfor %}
- {% if posts.has_next %}
- <a href="?p={{ posts.next_page_number }}">Next</a>
- {% endif %}
- </span>
- <span class="current">
- Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
- </span>
- </div>
- </body>
- </html>
扩展内置分页:Html
使用模板include
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <body>
- <ul>
- {% for row in posts.object_list %}
- <li>{{ row.name }}-{{ row.age }}</li>
- {% endfor %}
- </ul>
- {% include 'include/pager.html' %}
- </body>
- </html>
index
- {% if posts.has_previous %}
- <a href="/index?p={{ posts.previous_page_number }}">up</a>
- {% else %}
- <a href="#">up</a>
- {% endif %}
- {% for i in posts.paginator.pager_num_range %}
- {% if i == posts.number %}
- <a style="font-size: 30px;" href="/index?p={{ i }}">{{ i }}</a>
- {% else %}
- <a href="/index?p={{ i }}">{{ i }}</a>
- {% endif %}
- {% endfor %}
- {% if posts.has_next %}
- <a href="/index?p={{ posts.next_page_number }}">down</a>
- {% else %}
- <a href="#">down</a>
- {% endif %}
- <span>
- {{ posts.number }}/{{ posts.paginator.num_pages }}
- </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][下一页]
- from django.shortcuts import render
- from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
- USER_LIST = []
- for i in range(1,666):
- temp = {'name':'root'+str(i), 'age':i}
- USER_LIST.append(temp)
- def index2(request):
- from app01.pager import Pagination
- current_page = request.GET.get('p')
- page_obj = Pagination(666,current_page)
- data_list = USER_LIST[page_obj.start():page_obj.end()]
- return render(request,'index2.html',{'data':data_list,'page_obj':page_obj})
views.py
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- <link rel="stylesheet" href="/static/bootstrap-3.3.7-dist/css/bootstrap.css" />
- </head>
- <body>
- <ul>
- {% for row in data %}
- <li>{{ row.name }}-{{ row.age }}</li>
- {% endfor %}
- </ul>
- {% for i in page_obj.pager_num_range %}
- <a href="/index2.html?p={{ i }}">{{ i }}</a>
- {% endfor %}
- <hr/>
- <ul class="pagination pagination-sm">
- {{ page_obj.page_str|safe }}
- </ul>
- <div style="height: 300px;"></div>
- </body>
- </html>
index2
- class Pagination(object):
- def __init__(self,totalCount,currentPage,perPageItemNum=10,maxPageNum=7):
- # 数据总个数
- self.total_count = totalCount
- # 当前页
- try:
- v = int(currentPage)
- if v <= 0:
- v = 1
- self.current_page = v
- except Exception as e:
- self.current_page = 1
- # 每页显示的行数
- self.per_page_item_num = perPageItemNum
- # 最多显示页面
- self.max_page_num = maxPageNum
- def start(self):
- return (self.current_page-1) * self.per_page_item_num
- def end(self):
- return self.current_page * self.per_page_item_num
- @property
- def num_pages(self):
- """
- 总页数
- :return:
- """
- #
- #
- a,b = divmod(self.total_count,self.per_page_item_num)
- if b == 0:
- return a
- return a+1
- def pager_num_range(self):
- # self.num_pages()
- # self.num_pages
- # 当前页
- #self.current_page
- # 最多显示的页码数量 11
- #self.per_pager_num
- # 总页数
- # self.num_pages
- if self.num_pages < self.max_page_num:
- return range(1,self.num_pages+1)
- # 总页数特别多 5
- part = int(self.max_page_num/2)
- if self.current_page <= part:
- return range(1,self.max_page_num+1)
- if (self.current_page + part) > self.num_pages:
- return range(self.num_pages-self.max_page_num+1,self.num_pages+1)
- return range(self.current_page-part,self.current_page+part+1)
- def page_str(self):
- page_list = []
- first = "<li><a href='/index2.html?p=1'>首页</a></li>"
- page_list.append(first)
- if self.current_page == 1:
- prev = "<li><a href='#'>上一页</a></li>"
- else:
- prev = "<li><a href='/index2.html?p=%s'>上一页</a></li>" %(self.current_page-1,)
- page_list.append(prev)
- for i in self.pager_num_range():
- if i == self.current_page:
- temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>" %(i,i)
- else:
- temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
- page_list.append(temp)
- if self.current_page == self.num_pages:
- nex = "<li><a href='#'>下一页</a></li>"
- else:
- nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
- page_list.append(nex)
- last = "<li><a href='/index2.html?p=%s'>尾页</a></li>" %(self.num_pages,)
- page_list.append(last)
- return ''.join(page_list)
pager.py
总结,分页时需要做三件事:
- 创建处理分页数据的类
- 根据分页数据获取数据
- 输出分页HTML,即:[上一页][1][2][3][4][5][下一页]
Django(十四)分页器(paginator)及自定义分页D的更多相关文章
- Django之Cookie、Session和自定义分页
cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...
- Python自动化运维 - Django(二)Ajax基础 - 自定义分页
Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...
- 【.NET Core项目实战-统一认证平台】第十四章 授权篇-自定义授权方式
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章我介绍了如何强制令牌过期的实现,相信大家对IdentityServer4的验证流程有了更深的了解,本篇我将介绍如何使用自定义的授权方 ...
- python第十四课--排序及自定义函数之自定义函数(案例五)
演示函数的定义和使用细节: 默认参数:#在设计自定义函数的时候,就存在一个默认值,就算在调用的时候不显示的传入实参,也不会报错.#会用默认值来代替参与后期的运算 def m1(name='张三',ag ...
- python第十四课--排序及自定义函数之自定义函数(案例四)
整理:4中最常见的自定义函数模型1).无参无返回值2).无参有返回值3).有参无返回值4).有参有返回值 #定义无参无返回值自定义函数 def func1(): print('hello method ...
- python第十四课--排序及自定义函数之自定义函数(案例二)
案例二: python中定义有/无返回值的函数,演示python没有函数重载这一说 需求:自定义函数:计算两个整数的和值两个原则:1).有没形参有,两个 2).有没返回值可有可无 def my_sum ...
- python第十四课--排序及自定义函数之自定义函数(案例一)
案例一: 演示自定义函数的使用:包含:1).定义格式的掌握2).函数的好处 自定义函数:实现打印矩形的操作两个原则需要考虑:1).有没有形参?有,2个 2).有没有返回值?没有. def printR ...
- python第十四课--排序及自定义函数之案例二:冒泡排序
案例二:冒泡排序 lt1=[45,12,56,-32,-3,44,75,-22,100] print('排序前:'+str(lt1)) 自定义函数:实现冒泡排序(升序)原则:1).有没有形参?有,接受 ...
- python第十四课--排序及自定义函数
1.排序 特点: 1).升序:从小到大 2).降序:从大到小 课堂实现选择排序:参看老郭选择排序.py文件 2.函数:(方法/method) 自定义函数: 概念:它表示一段作用范围(作用域),当中封装 ...
- Vue.js 源码分析(十四) 基础篇 组件 自定义事件详解
我们在开发组件时有时需要和父组件沟通,此时可以用自定义事件来实现 组件的事件分为自定义事件和原生事件,前者用于子组件给父组件发送消息的,后者用于在组件的根元素上直接监听一个原生事件,区别就是绑定原生事 ...
随机推荐
- python之路--字典
一. 字典 字典是以key:value的形式来保存数据的,用{}表示 字典的增删改查 字典的增加 dic = {"意大利": "李云龙", "美国&q ...
- Node & CLI
Node & CLI cli 生成文件的原理是什么 https://nodejs.org/api/cli.html http://nodejs.cn/api/cli.html CLI & ...
- rand和randn
1,rand 生成均匀分布的伪随机数.分布在(0~1)之间 主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数 rand(m,n,'double')生成指定精度的均匀分布的伪随机数,参数还可 ...
- ES6字符串操作
讨论字符串操作之前,我们先来了解一下Unicode 编码的由来,因为Js中的字符串就是一系列Unicode码的集合. 我们都知道,世界上存在着各种各样的语言,汉语,英语,日语等,相对应的,也就存在各种 ...
- Nginx 慢启动与拥塞窗口
L:127
- ElasticSearch原理
Elasticsearch-基础介绍及索引原理分析 最近在参与一个基于Elasticsearch作为底层数据框架提供大数据量(亿级)的实时统计查询的方案设计工作,花了些时间学习Elasticsearc ...
- Redis宕机的问题
在主从模式下宕机要分为区分来看: slave从redis宕机 在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据: 如果从数据库实现了持久化,只要重新假如到主从架构中会实现增 ...
- LitJson的用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Codeforces Round #429 Div. 1
A:甚至连题面都不用仔细看,看一下样例就知道是要把大的和小的配对了. #include<iostream> #include<cstdio> #include<cmath ...
- pip 使用
PIP的使用 作用 管理python的标准第三方库 安装 sudo apt-get install python3-pip 常用命令 [1] 安装软件包 pip3 install [package] ...