45)django-分页实现
Django提供了一个新的类来帮助你管理分页数据,.它可以接收列表、元组或其它可迭代的对象。
一:常用方法
>>> from django.core.paginator import Paginator
>>> objects = ['john', 'paul', 'george', 'ringo']
>>> p = Paginator(objects, 2) >>> p.count
4
>>> p.num_pages
2
>>> type(p.page_range)
<class 'range_iterator'>
>>> p.page_range
range(1, 3) >>> page1 = p.page(1)
>>> page1
<Page 1 of 2>
>>> page1.object_list
['john', 'paul'] >>> page2 = p.page(2)
>>> page2.object_list
['george', 'ringo']
>>> page2.has_next()
False
>>> page2.has_previous()
True
>>> page2.has_other_pages()
True
>>> page2.next_page_number()
Traceback (most recent call last):
...
EmptyPage: That page contains no results
>>> page2.previous_page_number()
1
>>> page2.start_index() # The 1-based index of the first item on this page
3
>>> page2.end_index() # The 1-based index of the last item on this page
4 >>> p.page(0)
Traceback (most recent call last):
...
EmptyPage: That page number is less than 1
>>> p.page(3)
Traceback (most recent call last):
...
EmptyPage: That page contains no results
二:定义工具
定义工具,可供多个页面使用。
效果如下:

1)定义方法:pages.py
# -*- coding:utf-8 -*-
__author__ = 'lixiang' from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def page(request,post_objects,page_number=20):
"""
实现分页
:param request: view中request
:param post_objects: 需要实现分页的对象(列表,queryset)
:param page_number: #每页显示条数,默认20页
:return:
"""
#实例化结果集, queryset转列表
post_objects=list(post_objects)
paginator = Paginator(post_objects, page_number) # Show 20 contacts per page #获取htmml中传递page值
page = request.GET.get('page',1)
try:
#需要返回的值
page_objs = paginator.page(page)
except PageNotAnInteger:
# 如果page不是整数,返回第1页
page_objs = paginator.page(1)
except EmptyPage:
# 如果page超出最大值 ,只显示最后一页
page_objs = paginator.page(paginator.num_pages) return page_objs
2)定义模板:paginator.html
<!--显示记录数-->
<div class="dataTables_info" id="editable_info" role="status" aria-live="polite">
显示 {{ page_objs.start_index }} 至 {{ page_objs.end_index }} 条,共 {{ page_objs.paginator.count }} 条记录
</div>
<div class="text-right">
{% load page_tag %}
<ul class="pagination">
<!--显示首页和上一页-->
{% if page_objs.has_previous %}
<li class="footable-page-arrow"><a data-page="first" href="?page=1">首页</a></li>
<li class="footable-page-arrow"><a data-page="prev"
href="?page={{ page_objs.previous_page_number }}">上一页</a></li>
{% endif %}
<!--显示页码,只通过自定义tag,实现只显示3个页码,-->
{% for pg in page_objs.paginator.page_range %}
<!--参数:当前页,循环页-->
{% page_curent_show page_objs.number pg %}
{% endfor %} <!--显示尾页和下一页-->
{% if page_objs.has_next %}
<li class="footable-page-arrow"><a data-page="next" href="?page={{ page_objs.next_page_number }}">下一页</a>
</li>
<li class="footable-page-arrow"><a data-page="last" href="?page={{ page_objs.paginator.num_pages }}">尾页</a>
</li>
{% endif %}
</ul>
</div>
3)显示页码,通过自定义tag,实现只显示3个页码:page_tag.py
# -*- coding:utf-8 -*-
__author__ = 'lixiang'
from django import template
from django.utils.html import format_html
register=template.Library() @register.simple_tag
def page_curent_show(current_page,loop_page):
"""只显示3页码"""
offset=abs(current_page-loop_page)
if offset<3:
if current_page==loop_page:
#激活当前页
page_ele='<li class="footable-page active"><a data-page="1" href="?page=%s">%s</a></li>' %(loop_page,loop_page)
else:
page_ele='<li class="footable-page"><a data-page="1" href="?page=%s">%s</a></li>' %(loop_page,loop_page) return format_html(page_ele)
else:
return ""
4)视图调用示例
from utils.pages import page def menu_list(request):
menu_objs=models.Menu.objects.all()
page_objs=page(request,menu_objs,2)
return render(request, "juser/menu_list.html",{"page_objs":page_objs})
5)页面嵌入分页
<table id="demo-foo-addrow"
class="table table-bordered table-hover toggle-circle footable-loaded footable default"
data-page-size="">
<thead>
<tr>
<th data-sort-ignore="true" class="min-width footable-visible footable-first-column"></th>
<th data-sort-initial="true" data-toggle="true"
class="footable-visible footable-sortable footable-sorted">序号<span
class="footable-sort-indicator"></span></th>
<th class="footable-visible footable-sortable">菜单名<span
class="footable-sort-indicator"></span></th>
<th data-hide="phone, tablet" class="footable-visible footable-sortable">菜单位置<span
class="footable-sort-indicator"></span></th>
<th data-hide="phone, tablet" class="footable-visible footable-last-column footable-sortable">
操作<span
class="footable-sort-indicator"></span></th>
</tr>
</thead> <tbody> {% for menu_obj in page_objs %}
<tr class="footable-even" style="display: table-row;">
<td class="footable-visible footable-first-column">
<button class="demo-delete-row btn btn-danger btn-xs"><i class="demo-pli-cross"></i>
</button>
</td>
<td class="footable-visible"><span class="footable-toggle"></span>{{ forloop.counter }}</td>
<td class="footable-visible">{{ menu_obj.name }}</td>
<td class="footable-visible">{{ menu_obj.seq }}</td>
<td class="footable-visible">
<a><span class="label label-success">查看</span></a>
<a><span class="label label-dark">编辑</span></a>
<a><span class="label label-table label-danger">删除</span></a>
</td>
</tr>
{% endfor %}
</tbody>
<tfoot>
<tr>
<td colspan="" class="footable-visible">
{% include "paginator.html" %}
</td>
</tr>
</tfoot>
</table>
</div>
45)django-分页实现的更多相关文章
- django 分页组件
一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...
- django 分页(2) 使用类 页码显示
django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...
- Django 分页功能
Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...
- 原生的 django 分页
原始的 django 分页 # 基本 写法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, ...
- Django分页(二)
Django分页(二) 要求 .设定每页显示数据条数 # # .用户输入页码(第一页.第二页...) # # .设定显示多少页号 # # .获取当前数据总条数 # # .根据设定显示多少页号和数据总条 ...
- Django分页(一)
Django分页(一) 手动实现简单分页 HTML <!DOCTYPE html> <html lang="en"> <head> <me ...
- django 分页出现 UnorderedObjectListWarning 错误
django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unorde ...
- 2019.03.20 mvt,Django分页
MVT模式 MVT各部分的功能: M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返 ...
- Django分页类的封装
Django分页类的封装 Django ORM 封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...
- Django分页的实现
Django分页的实现 Django ORM 分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...
随机推荐
- Impala系列: Impala常用的功能函数
--=======================查看内置的函数--=======================hive 不需要进入什么内置数据库, 即可使用 show functions 命令列出 ...
- C# RestoreDirectory
OpenFileDialog与SaveFileDialog都有RestoreDirectory属性,这个属性默认是false,打开一 个文件后,那么系统默认目录就会指向刚才打开的文件.如果设为true ...
- Kali Linux之web安全扫描器skipfish使用
0x00.skipfish简介 谷歌公司出品的开源web程序评估软件. skipfish特点:CPU资源占用低,扫描速度快,每秒可以轻松处理2000个请求,误报率低. 1x00.skipfish使用 ...
- CSS面试复习(二):CSS的使用
一.CSS基础 1.选择器 选择器{ 属性:值: 属性:值 } 作用:用于匹配HTML元素.分类和权重.解析方式和性能.值得关注的选择器 分类: 元素选择器a{} 伪元素选择器::before{} 类 ...
- Flume配置Failover Sink Processor
1 官网内容 2 看一张图一目了然 3 详细配置 source配置文件 #配置文件: a1.sources= r1 a1.sinks= k1 k2 a1.channels= c1 #负载平衡 a1.s ...
- Hadoop之YARN思维导图
- byte数组和int之间相互转化的方法
Java中byte数组和int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送者接收的数据都是byte数组,但是int类型是4个byte组成的,如何把一个整形in ...
- 【blog】使用highlight.js高亮你的代码
我的代码 <!--代码高亮插件--> <link rel="stylesheet" type="text/css" href="/w ...
- typecho只能打开主页,文章详细内容打不开
安装环境: nginx+linux 问题描述: 安装了typecho显示成功安装,但是前端只显示标题和摘要,点击查看不了详细内容. 问题原因: PHP这块不支持pathinfo, 官网提供的解决方案有 ...
- MySql 在cmd下的学习笔记 —— 有关多表查询的操作(内连接,外连接,交叉连接)
mysql> create table test5( -> id int, ) -> )engine myisam charset utf8; Query OK, rows affe ...