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-分页实现的更多相关文章

  1. django 分页组件

      一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...

  2. django 分页(2) 使用类 页码显示

    django 分页显示页码 views.py 显示11页码 ) < 起始位置 - 10总页数 else 总页数 > IF 当前页 小于 起始位置 结束页 IF 当前页 大于 IF 如果结束 ...

  3. Django 分页功能

    Django 分页功能比较强大,这边是结合官网的内容写的可以参考 https://docs.djangoproject.com/en/1.9/topics/pagination/ 分页命令行练习案列 ...

  4. 原生的 django 分页

    原始的 django 分页 # 基本 写法 class Paginator(object): def __init__(self, object_list, per_page, orphans=0, ...

  5. Django分页(二)

    Django分页(二) 要求 .设定每页显示数据条数 # # .用户输入页码(第一页.第二页...) # # .设定显示多少页号 # # .获取当前数据总条数 # # .根据设定显示多少页号和数据总条 ...

  6. Django分页(一)

    Django分页(一) 手动实现简单分页 HTML <!DOCTYPE html> <html lang="en"> <head> <me ...

  7. django 分页出现 UnorderedObjectListWarning 错误

    django 分页出现此错误: UnorderedObjectListWarning: Pagination may yield inconsistent results with an unorde ...

  8. 2019.03.20 mvt,Django分页

    MVT模式   MVT各部分的功能:   M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理.       V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返 ...

  9. Django分页类的封装

    Django分页类的封装 Django ORM  封装 之前有提到(Django分页的实现)会多次用到分页,将分页功能封装起来能极大提高效率. 其实不是很难,就是将之前实现的代码全都放到类中,将需要用 ...

  10. Django分页的实现

    Django分页的实现 Django ORM  分页介绍 分页是网页浏览中常见到的一种形式,在数据量较大时,一个页面显示不全,采取分割数据由用户选择进行显示的方式. 基本实现 技术点 通过切片得到数据 ...

随机推荐

  1. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  2. select实现简单TCP通信(ubuntu 18.04)

    一.服务器程序(server.c) #include <stdio.h> #include <unistd.h> #include <stdlib.h> #incl ...

  3. IDApython教程(一)

    IDAPython是IDA的一个功能强大的扩展特性,对外提供了大量的IDA API调用.另外,还能在使用python 脚本语言的过程中获得能力提升,所以我强烈推荐所有的逆向工程师使用它. 然而不幸的是 ...

  4. .net DataTable序列化成Json

    /// <summary>/// DataTable序列化/// </summary>/// <param name="dt"></par ...

  5. IDEA 远程调试 Tomcat 和 Debugger

    一般来说我们本地环境使用Tomcat,生产环境使用GlassFish. 准备工作 明确远程服务器的 IP 地址,比如:192.168.92.128 关掉服务器防火墙:service iptables ...

  6. 1.3 第一个python程序

    使用Pycharm编写第一个python程序 1.打开 Pycharm,选择 Create New Project,创建一个新项目 2.选择Pure Python表示创建一个纯Python程序项目,  ...

  7. Empirical Evaluation of Speaker Adaptation on DNN based Acoustic Model

    DNN声学模型说话人自适应的经验性评估 年3月27日 发表于:Sound (cs.SD); Computation and Language (cs.CL); Audio and Speech Pro ...

  8. CentOS7.2卸载完CDH5.12后重装CDH

    1因为是重装很多环境ok A mysql环境ok B 防火墙ok C hostname绑定也没有问题 D jdk也是ok E root用户,所以不涉及权限,如果不是请设置sudo权限用户    F n ...

  9. oracle dblink的创建与使用

    一.什么是DBLINK dblink,顾名思义就是数据库的链接. 当我们要跨本地数据库访问另一个数据库中的表的数据时,在本地数据库中就必须要创建远程数据库的dblink,通过该dblink就可以达到访 ...

  10. python第五天,两个知识点三目运算符和assert抛异常处理。

    在python 2.5x之前是没有三目运算符的,但随着语言的发展,在2.5之后就加入了三目运算符 ''' 这里主要将三目运算符 其中也可以通过 x,y=4,5这种方式进行快速的声明变量和对变量赋值. ...