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 相关文章推荐
CentOS 7下安装Python3.6 及遇到的问题小结
Nov 08 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python使用adbapi实现MySQL数据库的异步存储
Mar 19 Python
Python使用matplotlib 画矩形的三种方式分析
Oct 31 Python
python线程信号量semaphore使用解析
Nov 30 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
pycharm中import呈现灰色原因的解决方法
Mar 04 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
python 爬取豆瓣网页的示例
Apr 13 Python
Python pyecharts案例超市4年数据可视化分析
Aug 14 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
php中使用PHPExcel读写excel(xls)文件的方法
2014/09/15 PHP
php如何利用pecl安装mongodb扩展详解
2019/01/09 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
js实现在字符串中提取数字
2013/11/05 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
jQuery的load()方法及其回调函数用法实例
2015/03/25 Javascript
jquery背景跟随鼠标滑动导航
2015/11/20 Javascript
Javascript中神奇的this
2016/01/20 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
js接收并转化Java中的数组对象的方法
2016/08/11 Javascript
jQuery实现弹窗居中效果类似alert()
2017/02/27 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
VUE前后端学习tab写法实例
2019/08/06 Javascript
express中static中间件的具体使用方法
2019/10/17 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
Python 除法小技巧
2008/09/06 Python
python根据距离和时长计算配速示例
2014/02/16 Python
Python中的__new__与__init__魔术方法理解笔记
2014/11/08 Python
Python利用带权重随机数解决抽奖和游戏爆装备问题
2016/06/16 Python
python Flask实现restful api service
2017/12/04 Python
python实现简单加密解密机制
2019/03/19 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
2019/05/16 Python
基于Python实现船舶的MMSI的获取(推荐)
2019/10/21 Python
CSS实现的一闪而过的图片闪光效果
2014/04/23 HTML / CSS
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
Android面试宝典
2013/08/06 面试题
高中生学习总结的自我评价范文
2013/10/13 职场文书
初中生学习的自我评价
2013/11/14 职场文书
《二泉映月》教学反思
2014/04/15 职场文书
反腐倡廉警示教育活动总结
2014/05/05 职场文书
工作作风承诺书
2014/08/30 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
党的群众路线批评与自我批评发言稿
2014/10/16 职场文书
2015团员个人年度总结
2015/11/24 职场文书
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL
Java完整实现记事本代码
2022/06/16 Java/Android