Django Paginator分页器的使用示例

yizhihongxing

当我们的网站数据量较大时,将其全部显示在一张页面上会导致页面加载速度变慢,用户体验也会大打折扣。在这种情况下,通常会采用分页器(Paginator)这一工具来将数据分页展示,提高页面加载速度和用户体验。

以下是 Django Paginator 分页器的使用示例的完整攻略:

1. 安装 Paginator

Django 自带了 Paginator 工具,不需要单独安装。

2. 在视图函数中使用分页器

我们需要在视图函数中进行分页器的设置。具体实现方式如下:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

def my_view(request):
    # 获取数据列表
    object_list = MyModel.objects.all()
    # 每页显示条数,可以更改
    page_size = 25 
    # 创建分页对象,传入列表和每页显示条数
    paginator = Paginator(object_list, page_size)
    # 获取当前页数
    page_number = request.GET.get('page')
    try:
        # 获取当前页的对象列表
        page_obj = paginator.get_page(page_number)
    except PageNotAnInteger:
        # 如果当前页数不是整数,返回第一页
        page_obj = paginator.get_page(1)
    except EmptyPage:
        # 如果当前页数大于总页数,返回最后一页
        page_obj = paginator.get_page(paginator.num_pages)
    return render(request, 'my_template.html', {'page_obj': page_obj})

以上是一个基础的分页器设置,在视图函数中需要进行的操作分别包括:

  1. 获取数据列表;
  2. 定义每页显示的条目数(可以自己设置);
  3. 创建分页对象,传入数据列表和每页显示的条目数;
  4. 获取当前页号,使用 request.GET.get('page') 方法;
  5. 使用 paginator.get_page(page_number) 方法获取当前页对象;
  6. 根据当前页的页号进行异常处理,防止错误。

3. 在模版中设置分页器

通过在视图函数中传递分页对象 page_obj ,在模板中进行分页器的设置,包括以下几个方面:

  1. 展现数据列表;
  2. 展现分页导航条:包括上一页、下一页、首页、尾页等相关链接;
  3. 展现页码:类似于 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ... 的效果;
  4. 样式调整。
{% if page_obj %}
  <ul class="pagination">
    {% if page_obj.has_previous %}
      <li><a href="?page=1" aria-label="First"><span aria-hidden="true">&laquo;</span></a></li>
      <li><a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&lt;</span></a></li>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
      {% if num == page_obj.number %}
        <li class="active"><span>{{ num }}</span></li>
      {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
      {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
      <li><a href="?page={{ page_obj.next_page_number }}" aria-label="Next"><span aria-hidden="true">&gt;</span></a></li>
      <li><a href="?page={{ page_obj.paginator.num_pages }}" aria-label="Last"><span aria-hidden="true">&raquo;</span></a></li>
    {% endif %}
  </ul>
{% endif %}

以上是一个简单的分页导航条设置,其中:

  1. ?page={{ page_obj.previous_page_number }} 可以返回上一页;
  2. ?page={{ page_obj.next_page_number }} 可以返回下一页;
  3. ?page={{ page_obj.paginator.num_pages }} 可以返回最后一页。

4. 分页的示例说明

示例一:

考虑一个博客网站首页,需要展示最新的 10 篇文章,每页 5 篇文章,需要设置分页器。

# views.py
from django.core.paginator import Paginator
from django.shortcuts import render
from channel.models import Article

def home(request):
    articles = Article.objects.order_by('-pub_time')[:10]
    paginator = Paginator(articles, 5)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'home.html', {
        'page_obj': page_obj
    })
<!-- home.html -->
{% if page_obj %}
  <!-- 数据展示 -->
  {% for article in page_obj %}
    <div>
        <h2>{{ article.title }}</h2>
        <p>{{ article.pub_time }}</p>
        <p>{{ article.content }}</p>
    </div>
  {% endfor %}
  <!-- 分页导航 -->
  <ul class="pagination">
    {% if page_obj.has_previous %}
      <li><a href="?page=1" aria-label="First"><span aria-hidden="true">&laquo;</span></a></li>
      <li><a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&lt;</span></a></li>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
      {% if num == page_obj.number %}
        <li class="active"><span>{{ num }}</span></li>
      {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
      {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
      <li><a href="?page={{ page_obj.next_page_number }}" aria-label="Next"><span aria-hidden="true">&gt;</span></a></li>
      <li><a href="?page={{ page_obj.paginator.num_pages }}" aria-label="Last"><span aria-hidden="true">&raquo;</span></a></li>
    {% endif %}
  </ul>
{% endif %}

以上的代码完整实现了在网站首页展示最新的 10 篇文章,每页 5 篇文章,同时设置了分页导航条。

示例二:

考虑一个评论分页的需求,假设需要展示对某个文章的全部评论,每页 10 条评论,需要设置评论的分页器。

# views.py
from django.core.paginator import Paginator
from django.shortcuts import render
from comment.models import Comment

def comments(request, post_id):
    comments = Comment.objects.filter(post_id=post_id)
    paginator = Paginator(comments, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'comments.html', {
        'page_obj': page_obj
    })
<!-- comments.html -->
{% if page_obj %}
  <!-- 评论展示 -->
  {% for comment in page_obj %}
    <div>
        <h4>{{ comment.user_name }}</h4>
        <p>{{ comment.content }}</p>
        <p>{{ comment.pub_time }}</p>
    </div>
  {% endfor %}
  <!-- 分页导航 -->
  <ul class="pagination">
    {% if page_obj.has_previous %}
      <li><a href="?page=1" aria-label="First"><span aria-hidden="true">&laquo;</span></a></li>
      <li><a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"><span aria-hidden="true">&lt;</span></a></li>
    {% endif %}
    {% for num in page_obj.paginator.page_range %}
      {% if num == page_obj.number %}
        <li class="active"><span>{{ num }}</span></li>
      {% elif num > page_obj.number|add:'-3' and num < page_obj.number|add:'3' %}
        <li><a href="?page={{ num }}">{{ num }}</a></li>
      {% endif %}
    {% endfor %}
    {% if page_obj.has_next %}
      <li><a href="?page={{ page_obj.next_page_number }}" aria-label="Next"><span aria-hidden="true">&gt;</span></a></li>
      <li><a href="?page={{ page_obj.paginator.num_pages }}" aria-label="Last"><span aria-hidden="true">&raquo;</span></a></li>
    {% endif %}
  </ul>
{% endif %}

以上的代码完整实现了在评论页面展示某个文章的全部评论,每页 10 条评论,同时设置了分页导航条。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django Paginator分页器的使用示例 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 利用Python抓取阿里云盘资源

    利用Python抓取阿里云盘资源攻略 阿里云盘是一款云存储服务,用户可以将文件上传到阿里云盘中进行存储和管理。本攻略将介绍如何使用Python抓取阿里云盘资源的完整攻略,包括登录、获取文件列表、下载文件等操作。 步骤1:登录阿里云盘 在Python中,我们可以使用selenium库模拟浏览器登录阿里云盘。以下是登录阿里云盘的示例代码: from seleni…

    python 2023年5月15日
    00
  • 网站优化教程:网站地图的建立

    关于网站优化教程中网站地图的建立,我们可以采取以下步骤来完成: 一、创建XML文件 在建立网站地图前,我们首先要创建一个XML(扩展标记语言)文件。XML文件是一种文本文件,用于描述数据的结构和内容。我们可以使用文本编辑器或专业编辑器来创建XML文件,其中必须包含以下元素: <?xml version=”1.0” encoding=”UTF-8”?&g…

    python 2023年6月3日
    00
  • Python实现动态循环输出文字功能

    下面是关于“Python实现动态循环输出文字功能”的攻略: 环境准备 在开始实现动态循环输出文字功能之前,我们需要先搭建好Python开发环境。具体的搭建步骤这里不再赘述,你可以通过搜索引擎找到相关的教程进行学习。 在环境搭建好之后,我们要安装一个Python的第三方库 blessed,用于在命令行中控制输出样式。可以通过在命令行中使用 pip 工具安装: …

    python 2023年6月3日
    00
  • 如何在Python中查询MySQL数据库中的数据?

    以下是在Python中查询MySQL数据库中的数据的完整使用攻略。 查询MySQL数据库中的数据简介 在Python中,可以使用mysql.connector模块连接MySQL数据库,并使用SELECT语句查询数据。查询结果可以使用游标对象fetchall()方法获取。 步骤1:导入模块 在Python中,使用mysql.connector模块连接MySQL…

    python 2023年5月12日
    00
  • Python-GUI wxPython之自动化数据生成器的项目实战

    Python-GUI wxPython之自动化数据生成器的项目实战攻略 项目简介 本项目使用Python GUI框架wxPython,实现了一个自动化数据生成器。用户可以通过界面输入各种参数,生成符合其需求的数据文件。 项目结构 项目主要分为三个模块:界面设计、数据生成和文件导出。界面设计使用wxPython实现,包括各种控件的设计和布局;数据生成实现在一个…

    python 2023年5月19日
    00
  • python3爬虫怎样构建请求header

    构建请求Header是爬虫中的重要一环,在Python3中,可以通过设置urllib库中的Request头部信息,来模拟浏览器发送请求,实现数据的获取。 以下是构建请求Header的完整攻略: 1. 了解User-Agent User-Agent是指浏览器的请求头信息中包含的代理信息,是服务器端识别访问请求来源的重要标识,不同的浏览器具有不同的User-Ag…

    python 2023年6月3日
    00
  • python遗传算法之geatpy的深入理解

    以下是关于“Python遗传算法之geatpy的深入理解”的完整攻略: 简介 遗传算法是一种常见的优化算法,它可以通过模拟生物进化过程来寻找最优解。Python中有多种库可以实现遗传算法,例如geatpy。本教程将介绍如何使用geatpy库实现遗传算法,并提供两个示例。 geatpy库 geatpy是一个Python库,它提供了多种遗传算法的实现。geatp…

    python 2023年5月14日
    00
  • python threading模块的使用指南

    当我们需要实现多线程的功能时,可以利用Python中的threading模块。下面是Python threading模块的使用指南。 一、基本介绍 threading模块提供了Thread类以及一些与线程相关的方法,可以管理线程的创建、启动、停止,还可以通过线程间同步机制来协调多个线程的执行。其中,常用的方法有以下几个: start():启动线程; join…

    python 2023年6月6日
    00
合作推广
合作推广
分享本页
返回顶部