我的网站搭建: (第三天) 分页功能

news/2024/7/19 9:22:41 标签: python, 爬虫, 后端

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    真的是挺久没有更新网站搭建了,因为最近在学习网络爬虫,又忙着考驾照,每一天都要练车,所以能利用的时间就只有晚上了。话不多说,直接开始了解Django的分页器吧,其实分页器的功能挺强大的,可以通过导入Paginator对象来实现文章的分页,列表的分页,还有上一页和下一页的功能。最好是参考Django的官方文档:分页|Django文档,也可以参考之前写的Django入门: (第十天) 分页器的使用,下面简单的写个例子吧

python">>>> from django.core.paginator import Paginator # 导入Paginator模块
>>> list1=[i for i in range(0,150)] # 使用列表生成器生成一个包含150个数字的列表
>>> page1=Paginator(list1,10) # 生成一个Paginator对象
>>> print(page1.count) # 打印总的记录数,即列表list1的长度
150
>>> print(page1.num_pages) # 打印总的页数,即总记录数除以每页显示的条目数
15
>>> print(page1.page_range) # 页数的列表
range(1, 16)
>>> print(page1.page(1)) # 打印第一页的page对象
<Page 1 of 15>
>>> page1.page(1).object_list # 打印第一页的所有记录
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> page1.page(2).object_list # 打印第二页的所有记录
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> page1.page(2).next_page_number() # 打印当前的页(第2页)的下一页的页码
3
>>> page1.page(2).has_next() # 第2页是否有下一页
True
>>> page1.page(2).has_previous() # 第2页是否有上一页
True
>>> page1.page(2).has_other_pages() # 第2是否有其他页
True
>>> page1.page(2).start_index() # 第2页第一条记录的序号
11
>>> page1.page(2).end_index() # 第2页最后一条记录的序号
20
>>> page1.page(0) # 第0页是否有记录,会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    ...
    raise EmptyPage(_('That page number is less than 1'))
django.core.paginator.EmptyPage: <exception str() failed>
>>> page1.page(15) # 打印第15页的对象
<Page 15 of 15>

    后端分页功能代码 :

python">from django.core.paginator import Paginator #导入Paginator模块

# 创建一个分页器对象,参数分别是文章列表,每页最大文章数量
# 这里的EACH_RAGE_BLOG_NUMBER等于10,已经当成常量写进了seetings里
paginator = Paginator(post_all_list, settings.EACH_RAGE_BLOG_NUMBER)

# 采用get方式获取用户访问的页码,如果获取不到,默认为第一页
page_num = request.GET.get('page', 1)

# 因为用户输入不一定是数字,所以需要用int(page_num),而django里的get_page会自动识别用户输入以及页码范围
# 注意这里的page_of_list是一个paginator对象
page_of_list = paginator.page(int(page_num))

# 获取当前页码
current_page_num = page_of_list.number

# 获取当前页码前后各两页的页码范围
# 需要注意判断的是:如果当前页是第一页,那么前两页不能是0,也不能是-1,所以要使用内置max函数来与1比较最大值
# 同理:如果当前页已经是最后一页,那么就不能取到当前页+2的页码了,所以要使用内置min函数来与最大页码比较最小值
page_range = list(range(max(current_page_num - 2, 1), current_page_num)) + \
    list(range(current_page_num, min(current_page_num + 2, paginator.num_pages) + 1))

# 加上省略页码标记
# paginator.num_pages表示一共有多少页码
if page_range[0] - 1 >= 2:
    page_range.insert(0, '...')
if paginator.num_pages - page_range[-1] >= 2:
    page_range.append('...')

# 加上首页尾页
# paginator.num_pages表示一共有多少页码
if page_range[0] != 1:
    page_range.insert(0, 1)
if page_range[-1] != paginator.num_pages:
    page_range.append(paginator.num_pages)

    前端代码:

<div class="paginator">
    <ul class="pagination">
        <li>
            {# 上一页 #}
            {% if page_of_list.has_previous %}
                <a href="?page={{ page_of_list.previous_page_number }}" aria-label="Previous">
                    <span aria-hidden="true">上一页</span>
                </a>
            {% else %}
                <span aria-hidden="true">&laquo;</span>
            {% endif %}
        </li>
        {# 全部页码 #}
        {# {% for page_num in page_of_list.paginator.page_range %}#}
        {# page_range在views中被处理成当前页数+-2的范围,目的是为了避免页码过于长#}
        {% for page_num in page_range %}
            {# 判断是否当前页 #}
            {% if page_num == page_of_list.number %}
                {# 如果是当前页就设置active高亮 #}
                <li class="active"><a href="?page={{ page_num }}">{{ page_num }}</a></li>
            {% else %}
                {% if page_num == '...' %}
                    <li><span>{{ page_num }}</span></li>
                {% else %}
                    <li><a href="?page={{ page_num }}">{{ page_num }}</a></li>
                {% endif %}
            {% endif %}
        {% endfor %}
                <li>
        {# 下一页 #}
        {% if page_of_list.has_next %}
            <a href="?page={{ page_of_list.next_page_number }}" aria-label="Previous">
                <span aria-hidden="true">下一页</span>
            </a>
        {% else %}
            <span aria-hidden="true">&raquo;</span>
                </li>
        {% endif %}
    </ul>
    <p>
        共有{{ page_of_list.paginator.count }}篇博客,
        当前第{{ page_of_list.number }}页, 共{{ page_of_list.paginator.num_pages }}页
    </p>
</div>

 

转载于:https://my.oschina.net/zhenfei/blog/1933469


http://www.niftyadmin.cn/n/929491.html

相关文章

存储过程和触发器的取舍问题(优缺点分析)

存储过程和触发器的取舍问题&#xff08;优缺点分析&#xff09;2013年07月24日 16:50:22 Jesse621 阅读数&#xff1a;12975 标签&#xff1a; 存储过程触发器优缺点 更多个人分类&#xff1a; 【Database】 由于要给同学分享一些关于数据库中存储过程和触发器的知识&#xff…

springboot之日志框架配置

日志框架配置 框架引入 <!-- <dependency>--><!-- <groupId>org.slf4j</groupId>--> <!-- <artifactId>slf4j-log4j12</artifactId>--><!-- </dependency>--><dependenc…

视频转成在github的readme中展示项目的gif动图

本文中涉及的FastStone Capture和FFmpeg两个软件的百度网盘链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1D5LO9Qmjl-vwJZfnbAloyQ 提取码&#xff1a;56u8 &#xff08;本文提供教程参考或官网链接&#xff0c;如果文章中没有讲清楚的地方可自行前往参考链接协…

linux之文件类型及file命令

linux的文件类型介绍&#xff1a;- 文件普通文件纯文本文件ASCII 二进制文件 数据格式文件d 目录l 链接文件设备与设备文件&#xff1a;b 块设备&#xff0c;如/dev/sda1c 字符设备&#xff0c;如键盘鼠标(串行端口的设备)s 套接字p 管道文件(又称FIFO文件类型)file:判定文件类…

使用pageoffice进行多个文档的合并

提前给test模板文件中 手动插入一个书签&#xff0c;因为pageoffice必须有一个书签后&#xff0c;才能在后台进行书签的创建 //多个word文件进行合并string strCopyFolder System.Web.HttpContext.Current.Server.MapPath("~/weboffice/tempfiles/test/");string[] …

深度探索区块链/区块链概述(1)

一。区块链&#xff08;Blockchain&#xff09;的前世今生 1。区块链的历史起源--比特币 2。区块链概念&#xff1a; 区块链技术让参与的系统中任意多个节点&#xff0c;通过密码学算法把一段时间系统内的全部信息交流数据计算和记录到一个数据块&#xff08;Block&#xff09;…

基于JVM之上的并发编程模式剖析

并发编程的概念并不新鲜&#xff0c;每一种编程语言中都内置了相关的支持&#xff0c;而有些编程语言因为对并发提供了更有友好的支持而得到了更多的关注。拥抱并发使用并发编程并不仅仅是为了CPU多核从而使得程序能够并行执行&#xff0c;其本质其实就是为了消除延迟&#xff…

如何解决Mybatis里mapper文件中关于不能用大于小于号

用<![CDATA[ ]]>标识比如&#xff1a;<![CDATA[ where auctionEndTime < now()]]> 另外一种方法就是使用转义字符 <<>>&" < < > > &amp; &apos; &quot; 原文&#xff1a;https://blog.csdn.net/qq_386596…