Django实现分页功能


Posted in Python onJuly 02, 2018

Django提供了一个新的类来帮助你管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。

class Paginator(object):
 
  def __init__(self, object_list, per_page, orphans=0,
         allow_empty_first_page=True):
    self.object_list = object_list
    self.per_page = int(per_page)
    self.orphans = int(orphans)
    self.allow_empty_first_page = allow_empty_first_page
 
……

 

基本语法实例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
 
import os
 
from django.core.paginator import Paginator
objects = ['john','paul','george','ringo','lucy','meiry','checy','wind','flow','rain']<br>
p = Paginator(objects,3) # 3条数据为一页,实例化分页对象
print p.count # 10 对象总共10个元素
print p.num_pages # 4 对象可分4页
print p.page_range # xrange(1, 5) 对象页的可迭代范围
 
page1 = p.page(1) # 取对象的第一分页对象
print page1.object_list # 第一分页对象的元素列表['john', 'paul', 'george']
print page1.number # 第一分页对象的当前页值 1
 
page2 = p.page(2) # 取对象的第二分页对象
print page2.object_list # 第二分页对象的元素列表 ['ringo', 'lucy', 'meiry']
print page2.number # 第二分页对象的当前页码值 2
 
print page1.has_previous() # 第一分页对象是否有前一页 False
print page1.has_other_pages() # 第一分页对象是否有其它页 True
 
print page2.has_previous() # 第二分页对象是否有前一页 True
print page2.has_next() # 第二分页对象是否有下一页 True
print page2.next_page_number() # 第二分页对象下一页码的值 3
print page2.previous_page_number() # 第二分页对象的上一页码值 1
print page2.start_index() # 第二分页对象的元素开始索引 4
print page2.end_index() # 第2分页对象的元素结束索引 6

 官方解释在视图中的应用

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
 
def listing(request):
  contact_list = Contacts.objects.all()
  paginator = Paginator(contact_list, 25) # Show 25 contacts per page
 
  page = request.GET.get('page')
  try:
    contacts = paginator.page(page)
  except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    contacts = paginator.page(1)
  except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    contacts = paginator.page(paginator.num_pages)
 
  return render(request, 'list.html', {'contacts': contacts})

在template的html模板中的应用

{% for contact in contacts %}
  {# Each "contact" is a Contact model object. #}
  {{ contact.full_name|upper }}<br />
  ...
{% endfor %}
 
<div class="pagination">
  <span class="step-links">
    {% if contacts.has_previous %}
      <a href="?page={{ contacts.previous_page_number }}">previous</a>
    {% endif %}
 
    <span class="current">
      Page {{ contacts.number }} of {{ contacts.paginator.num_pages }}.
    </span>
 
    {% if contacts.has_next %}
      <a href="?page={{ contacts.next_page_number }}">next</a>
    {% endif %}
  </span>
</div>

举例讲述分页功能的使用目的说明

现要实现如下功能

1、网页上显示分页数据,3条数据为一页

2、有分页导航功能,被选中页高亮显示

3、如果没有上一页或下一页,则不出现箭头导航

4、如果最后一页的数据少于2条,合并到上一页

效果图

图1:

Django实现分页功能

 

图2:

Django实现分页功能

 视图定义

Django实现分页功能

  定义templates

 Django实现分页功能

 分页功能优化

目标:

1、在template中的html模板中使用自定义函数

2、不管有多少分页,页面上最多显示5页

 

基础知识

Django的模板语言包含了各种各样的内置标签和过滤器来满足你的应用需求,不过有时候你也会发现你的需要的功能不在内置的功能中,这时候你可以通过Python语言自定义标签和过滤器来扩展模板引擎,然后在你的模板中使用{% load %}来加载使用它们。

在你的app下创建templatetags包,在其下创建python脚本来定义你的标签和过滤器,如:

polls/
  __init__.py
  models.py
  templatetags/
    __init__.py
    poll_extras.py
  views.py

然后在你的模板中使用

{% load poll_extras %}

项目实战

自定义过滤器和标签

Django实现分页功能

在模板中引用

Django实现分页功能

效果图:

Django实现分页功能

https://github.com/kongzhagen/python/tree/master/Django

Python 相关文章推荐
[原创]windows下Anaconda的安装与配置正解(Anaconda入门教程)
Apr 05 Python
在python里协程使用同步锁Lock的实例
Feb 19 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
Python3内置模块pprint让打印比print更美观详解
Jun 02 Python
python操作文件的参数整理
Jun 11 Python
python列表返回重复数据的下标
Feb 10 Python
Python3 读取Word文件方式
Feb 13 Python
python如何通过闭包实现计算器的功能
Feb 22 Python
Django数据库操作之save与update的使用
Apr 01 Python
简单了解Python多态与属性运行原理
Jun 15 Python
python中Array和DataFrame相互转换的实例讲解
Feb 03 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
Jun 29 Python
详解python单元测试框架unittest
Jul 02 #Python
python中多层嵌套列表的拆分方法
Jul 02 #Python
python中int与str互转方法
Jul 02 #Python
用Python将一个列表分割成小列表的实例讲解
Jul 02 #Python
python绘制圆柱体的方法
Jul 02 #Python
Django开发中的日志输出的方法
Jul 02 #Python
Python中循环后使用list.append()数据被覆盖问题的解决
Jul 01 #Python
You might like
如何使用GDB调试PHP程序
2015/12/08 PHP
PHP实现上传多文件示例代码
2017/02/20 PHP
JavaScript Prototype对象
2009/01/07 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
深入理解JavaScript系列(10) JavaScript核心(晋级高手必读篇)
2012/01/15 Javascript
jQuery中children()方法用法实例
2015/01/07 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
vue引入jq插件的实例讲解
2017/09/12 Javascript
jQueryMobile之窗体长内容的缺陷与解决方法实例分析
2017/09/20 jQuery
jqueryUI tab标签页代码分享
2017/10/09 jQuery
jQuery判断自定义属性data-val用法示例
2019/01/07 jQuery
vue实现路由切换改变title功能
2019/05/28 Javascript
python3.5 tkinter实现页面跳转
2018/01/30 Python
Python对excel文档的操作方法详解
2018/12/10 Python
pyspark操作MongoDB的方法步骤
2019/01/04 Python
django 控制页面跳转的例子
2019/08/06 Python
python 统计list中各个元素出现的次数的几种方法
2021/02/20 Python
纯CSS3实现自定义Tooltip边框涂鸦风格的教程
2014/11/05 HTML / CSS
Python文件操作的面试题
2013/06/22 面试题
学术会议邀请函范文
2014/01/22 职场文书
心理健康教育制度
2014/01/27 职场文书
销售经理工作职责
2014/02/03 职场文书
军训教官感言
2014/03/02 职场文书
乔丹名人堂演讲稿
2014/05/24 职场文书
酒店节能减排方案
2014/05/26 职场文书
学习党章的体会
2014/11/07 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
大学新生入学感想
2015/08/07 职场文书
2016年感恩母亲节活动总结
2016/04/01 职场文书
在python中实现导入一个需要传参的模块
2021/05/12 Python
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis
Java中Dijkstra(迪杰斯特拉)算法
2022/05/20 Java/Android
Apache POI操作批量导入MySQL数据库
2022/06/21 Servers
nginx之queue的具体使用
2022/06/28 Servers