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 相关文章推荐
python client使用http post 到server端的代码
Feb 10 Python
Python打印输出数组中全部元素
Mar 13 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
python pandas 如何替换某列的一个值
Jun 09 Python
基于Python List的赋值方法
Jun 23 Python
详解Django中间件的5种自定义方法
Jul 26 Python
pymongo中group by的操作方法教程
Mar 22 Python
python中使用ctypes调用so传参设置遇到的问题及解决方法
Jun 19 Python
Python for循环通过序列索引迭代过程解析
Feb 07 Python
Python 必须了解的5种高级特征
Sep 10 Python
python基于爬虫+django,打造个性化API接口
Jan 21 Python
python numpy中multiply与*及matul 的区别说明
May 26 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
Zend Studio (eclipse)使用速度优化方法
2011/03/23 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JS 文件本身编码转换 图文教程
2009/10/12 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
jQuery性能优化28条建议你值得借鉴
2013/02/16 Javascript
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
Javscript删除数组中指定元素并返回新数组
2014/03/06 Javascript
javascript生成随机颜色示例代码
2014/05/05 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
vue.js实现含搜索的多种复选框(附源码)
2017/03/23 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
2017/08/31 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
动态加载权限管理模块中的Vue组件
2018/01/16 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
vue生命周期实例小结
2018/08/15 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
javascript实现自由编辑图片代码详解
2019/06/21 Javascript
cordova+vue+webapp使用html5获取地理位置的方法
2019/07/06 Javascript
python strip()函数 介绍
2013/05/24 Python
python实现从网络下载文件并获得文件大小及类型的方法
2015/04/28 Python
python实现的希尔排序算法实例
2015/07/01 Python
python使用PyCharm进行远程开发和调试
2017/11/02 Python
python opencv3实现人脸识别(windows)
2018/05/25 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
澳大利亚最大的护发和护肤品购物网站:RY
2019/12/26 全球购物
国外的一些J2EE面试题一
2012/10/13 面试题
函授毕业自我鉴定
2013/12/19 职场文书
师生聚会感言
2014/01/26 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
2015年大学生实习评语
2015/03/25 职场文书
2016年感恩教师节活动总结
2016/04/01 职场文书
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript
微软Win11什么功能最惊艳? Windows11新功能特性汇总
2021/11/21 数码科技