导入模块:from django.core.paginator import Paginator

一、Paginator的基本用法:

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

二、分页功能实现实例:

模型:model.py

# 新闻 数据库模型
class News(models.Model):
# 标题
title = models.CharField(max_length=100, null=False)
# 发布日期
pub_time = models.DateTimeField(auto_now_add=True) class Meta:
# 在去模型数据的时候,按照 pub_time 字段降序排序
ordering = ['-pub_time']

视图函数:view.py


from django.core.paginator import Paginator
from datetime import datetime
# 需要导入模型:News
# 时区转换
from django.utils.timezone import make_aware
class news_list_View(View):
def get(self, request):try:
# request.GET.get('category',默认值):这个默认值只有在没有category这个属性的时候才会使用
# 如果传入的是一个 "" 空字符串,也不会使用默认值
# 所以需要 or 0 保证不为空
# category_id = int(request.GET.get('category', 0) or 0)
page = int(request.GET.get('p', 1))
except:
return HttpResponseRedirect("/cms/news_list/?p=1")
news_all = News.objects.all()# 创建 Paginator对象
# 参数1:一个可遍历的object对象
# 参数2:指定多少条数据为一页
paginator = Paginator(news_all, 10)
# 获取分页对象
# 参数page:int(第几页数据)
page_obj = paginator.page(page)
# 分页算法逻辑方法
getdata = self.get_pagination_data(page_obj, paginator)
content = {# 直接将分页对象 page_obj 对象发送给前端
'page_obj': page_obj,# 获取一个可遍历的对象:range(1,paginator.count)
# 'count_page': paginator.page_range
}
# 更新字典
content.update(getdata)
return render(request, 'cms/news_list.html', context=content) def get_pagination_data(self, page_boj, paginator, page_news_count=2):
"""
     分页优化
:param page_boj:当前页面对象
:param paginator: Paginator 分页对象
:param page_news_count: 左右两边显示多少页面(前端页数) “[1] [...] [5] [6] [7] [8] [9] [...] [99]”
:return:
"""
# 获取当前页码
page_num = page_boj.number
# 得到当前可以分为多少页,获取总页数
count = paginator.num_pages
# 判断分页是否显示 “ ... ”
left_has_more = False
right_has_more = True
# 返回左右显示的页码区间 range(start,end+1) 如: 1 ... 5 6 7 8 9 ... 99
# left_page_count
# right_page_count
     
     # 如果当前页码 >= 最大页码 -1 - page_news_count,那么就不显示 ...
if page_num >= count - page_news_count - 1:
right_has_more = False
right_page_count = range(page_num + 1, count + 1)
else:
right_page_count = range(page_num + 1, page_num + 1 + page_news_count)
     #
if page_num >= 2 + page_news_count:
left_has_more = True
left_page_count = range(page_num - page_news_count, page_num)
else:
left_page_count = range(1, page_num)
return {
# 是否显示 ...
'left_has_more': left_has_more,
'right_has_more': right_has_more,
# 左边应该显示的页码
'left_page_count': left_page_count,
# 右边应该显示的页码
'right_page_count': right_page_count,
# 最大页数
'count': count

  前端HTML模板:

   备注:使用的是 adminLTE插件完成,需要下载和导入文件如下:

    下载:adminLTE 源码


   <link rel="stylesheet" href="{% static 'adminlte/bower_components/bootstrap/dist/css/bootstrap.min.css' %}">
<link rel="stylesheet" href="{% static 'adminlte/bower_components/font-awesome/css/font-awesome.min.css' %}">
<link rel="stylesheet" href="{% static 'adminlte/bower_components/Ionicons/css/ionicons.min.css' %}">
<link rel="stylesheet" href="{% static 'adminlte/dist/css/AdminLTE.min.css' %}">
<link rel="stylesheet" href=" {% static 'adminlte/dist/css/skins/_all-skins.min.css' %}">
<link rel="stylesheet" href="{% static 'adminlte/plugins/bootstrap-wysihtml5/bootstrap3-wysihtml5.min.css' %}"> {# <link rel="stylesheet" href="{% static 'css_dist/common/sweetalert.min.css' %}">#}
<link rel="stylesheet" href="http://mishengqiang.com/sweetalert/css/sweetalert.css">
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<script src="{% static 'adminlte/bower_components/jquery/dist/jquery.min.js' %}"></script>
<script src="{% static 'adminlte/bower_components/bootstrap/dist/js/bootstrap.min.js' %}"></script>
<script src="{% static 'adminlte/bower_components/jquery-slimscroll/jquery.slimscroll.min.js' %}"></script>
<script src="{% static 'adminlte/bower_components/fastclick/lib/fastclick.js' %}"></script>
<script src="{% static 'adminlte/dist/js/adminlte.min.js' %}"></script>
<script src="{% static 'adminlte/dist/js/demo.js' %}"></script>
<body>
  <div class="content-wrapper">
<section class="content-header">
<h1>新闻列表</h1>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="box box-primary">
<div class="box-header">
<!-- form-inline:横向排列 -->

</div>
<div class="box-body">
<table class="table table-bordered">
<thead>
<tr role="row">
<td>标题</td>
<td>发布时间</td>
<td>操作</td>
</tr>
</thead>
<tbody>
{% for news in page_obj %}
<tr>
<td><a href="{% url 'news:news_detail' news_id=news.id %}">{{ news.title }}</a></td>
<td>{{ news.pub_time|time_format }}</td>
<td>
<a href="#" class="btn btn-info btn-xs">编辑</a>
<button class="btn btn-danger btn-xs delete-btn" data-news-id="{{ news.pk }}">
删除
</button>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<div class="box-footer">
            <!-- page_obj:当前页面的对象 -->
<lable>总页数:{{ page_obj.number }} / {{ count }}</lable>
<ul class="pagination pull-right">
              <!-- page_obj.has_previous:判断是否还有上一页 -->
{% if page_obj.has_previous %}
                 <!-- page_obj.previous_page_number:获得上一页页码 -->
<li><a href="?p={{ page_obj.previous_page_number }}">上一页</a></li>
{% else %}
<li class="disabled"><a href="javascript:void(0)">上一页</a></li>
{% endif %}
{% if left_has_more %}
<li><a href="?p=1">1</a></li>
<li><a href="javascript:void(0)">...</a></li>
{% endif %}

{% for left_page in left_page_count %}
<li><a href="?p={{ left_page }}">{{ left_page }}</a></li>
{% endfor %}

<li class="active"><a href="?p={{ page_obj.number }}">{{ page_obj.number }}</a>
</li>

{% for right_page in right_page_count %}
<li><a href="?p={{ right_page }}">{{ right_page }}</a></li>
{% endfor %}

{% if right_has_more %}
<li><a href="javascript:void(0)">...</a></li>
<li><a href="?p={{ count }}">{{ count }}</a></li>
{% endif %}
              <!-- page_obj.has_next:判断是否还有下一页 -->
{% if page_obj.has_next %}
                 <!-- page_obj.next_page_number:获得下一页页码 -->
<li><a href="?p={{ page_obj.next_page_number }}">下一页</a></li>
{% else %}
<li class="disabled"><a href="javascript:void(0)">下一页</a></li>
{% endif %}
</ul>
</div>
</div>
</div>
</div>
</section>
  </div>
</body>

效果:

All I had was dreams and unfounded self-confidence. But everything starts here.

最初所拥有的只是梦想,以及毫无根据的自信而已。但是,所有的一切就从这里出发。

django之分页算法实现(Paginator)的更多相关文章

  1. django 百度分页算法

    效果如下: 脚本: 1. 脚本结构 2.pagination.py from django.utils.safestring import mark_safe class Page: ''' curr ...

  2. Python Django的分页,Form验证,中间件

    本节内容 Django的分页 Form 中间件 1 Django 分页 1.1 Django自带的分页 1.首先来看下我的测试数据环境 ############ models.py ######### ...

  3. Django----列表分页(使用Django的分页组件)

    目的:是为了实现列表分页 1.定制URL http://127.0.0.1:8000/blog/get_article?page=3之前定制URL是在url后增加了/id,这次使用参数的方式 def ...

  4. django网页分页

    blog/views.py from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger #导入分页插件包 def  ...

  5. Django—自定义分页

    分页功能在每个网站都是必要的,对于分页来说,其实就是根据用户的输入计算出应该显示在页面上的数据在数据库表中的起始位置. 确定分页需求: 1. 每页显示的数据条数 2. 每页显示页号链接数 3. 上一页 ...

  6. Django 实现分页功能(django 2.2.7 python 3.7.5 )

    Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能.本文就讲解如何使用 Paginator 实现分页功能. 一. Paginator Paginator 类的作用是将我们需 ...

  7. ASP的高效率的分页算法.net,php同样可以参考

    一般习惯使用的有两种分页算法,一是传统的ADO分页,二是SELECT TOP分页算法.对于小型数据表,比如一两万的数据量的表,我倾向使用ADO算法,对于大型的数据表,则必须采用后者的算法了. 先来说说 ...

  8. 基于视觉的Web页面分页算法VIPS的实现源代码下载

    基于视觉的Web页面分页算法VIPS的实现源代码下载 - tingya的专栏 - 博客频道 - CSDN.NET 基于视觉的Web页面分页算法VIPS的实现源代码下载 分类: 技术杂烩 2006-04 ...

  9. VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]

    VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] 分类 ...

随机推荐

  1. Lucky Substrings

    而在26以内且属于fibonacci数列的数为1,2,3,5,8,13,21时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if ...

  2. Codeforces 931D:Peculiar apple-tree

    D. Peculiar apple-tree time limit per test : 1 second memory limit per test : 256 megabytes input : ...

  3. Spring Boot 2 中如何使用 Log4j2 记录日志

    上一篇我们介绍了Spring Boot 2.x中默认日志框架Logback的使用.今天继续说说日志,接下来我们要讲是前段时间爆出核弹漏洞的Log4j2.虽然出了漏洞,让很多小伙伴痛苦了1-2周(加班) ...

  4. CS229 机器学习课程复习材料-概率论

    本文是斯坦福大学CS229机器学习课程的基础材料,原始文件下载 原文作者:Arian Maleki , Tom Do 翻译:石振宇 审核和修改制作:黄海广 备注:请关注github的更新. CS229 ...

  5. 「物流跟踪管理系统」 · Java Swing + MySQL JDBC开发,美和易思结业考试机试试题

    目录 文档说明: 一.语言和环境 二.技术要求 三.功能要求 四.数据库设计 五.具体要求及推荐实现步骤 六.注意事项 实现代码: 一.数据库 二.Java Swing com.ynavc.Bean ...

  6. emqx的一个配置参数

    这个参数尝试改为internal后,所有用户都可以匿名登录

  7. Zookeeper基础教程(一):认识Zookeeper

    引用百度百科的话 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服 ...

  8. MATLAB 右键该文件不存在或者SIMULINK打开后仿真器件报错

    错误示例: 提示是否创建文件 并且会提示某某模块或者某某文件未找到not found 原因: .m文件不存在,是因为所打开的文件还并没有添加进matlab的搜索目录,或者是需要.m文件运行后生成的 某 ...

  9. Nginx_配置文件nginx.conf配置详解

    user nginx nginx ; # Nginx用户及组:用户 组.window下不指定 worker_processes 8; # 工作进程:数目.根据硬件调整,通常等于CPU数量或者2倍于CP ...

  10. Django_模型类详解(七)

    # 定义书籍模型类 class BookInfo(models.Model): btitle = models.CharField(max_length=20) # 书籍名称 bpub_date = ...