Django Paginator分页器的使用示例

当我们的网站数据量较大时,将其全部显示在一张页面上会导致页面加载速度变慢,用户体验也会大打折扣。在这种情况下,通常会采用分页器(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编写一个文件搜索工具。 1. 问题分析 无论是什么样的搜索工具,其实现的基本步骤大致相同: 搜寻起点 搜寻过滤规则 搜寻输出 这些步骤中, 发现一个文件搜索工具的最基本要求就是依据用户的输入对文件进行搜寻。也就是说我们需要输入:搜寻路径、搜寻关键词。我…

    python 2023年6月2日
    00
  • python实现简单五子棋游戏

    Python 实现简单五子棋游戏攻略 本攻略将分为三部分:环境准备、游戏规则与开发实现。 环境准备 本项目需要在 Python 环境下完成开发。如果您尚未安装 Python,请先安装 Python 并确认环境变量配置正确。 此外,本项目需要使用到一些第三方库,包括 Pygame,Numpy 等,请使用 pip 工具安装: pip install pygame…

    python 2023年5月19日
    00
  • python进阶教程之函数参数的多种传递方法

    Python进阶教程之函数参数的多种传递方法攻略 Python中的函数参数传递方式有多种,下面将对这些传递方式进行详细讲解。 1. 位置参数传递 位置参数是最常见的一种参数传递方式,当我们调用函数时,传递的实参会按顺序一一对应函数定义时的形参,如下所示: def print_info(name, age, gender): print("Name:…

    python 2023年6月5日
    00
  • Python函数式编程指南:对生成器全面讲解

    Python函数式编程指南:对生成器全面讲解 什么是函数式编程? 函数式编程(Functional Programming)是一种编程范式,它是过程化编程和面向对象编程之外的第三种主流编程范式。 函数式编程强调的是函数的运算和结果,而不是计算的过程。它采用数学中的函数概念,避免使用状态和可变数据,以达到消除副作用的目的。 什么是生成器? 生成器是 Pytho…

    python 2023年6月3日
    00
  • Python tkinter 多选按钮控件 Checkbutton方法

    Python tkinter多选按钮控件Checkbutton方法用于创建多个选项供用户选择,用户可以同时选择多个选项。Checkbutton控件类似于单选按钮,不同之处在于用户可以选择多个选项。以下是详细的攻略: 创建Checkbutton控件 要创建Checkbutton控件,需要使用tkinter库,代码如下: from tkinter import …

    python 2023年6月13日
    00
  • python中的内置函数getattr()介绍及示例

    Python中的内置函数getattr()介绍及示例 介绍 getattr()是Python内置函数之一,用于获取对象的属性值或者方法。 它包含三个参数,分别是object、name和default,其中object是要获取属性或方法的对象,name则为属性或方法名,default为默认返回值,当获取的属性或方法不存在时返回该值。 使用方法示例 示例一:获取…

    python 2023年6月5日
    00
  • Sublime Text 配置 Python 环境的问题及解决方案

    下面是 Sublime Text 配置 Python 环境的完整攻略,包含以下几个步骤: 1. 安装 Python 首先需要安装 Python,可以去官网 (https://www.python.org/downloads/) 下载安装包。下载完成后,运行安装程序并按照提示完成安装。 2. 设置系统环境变量 安装完成后,需要将 Python 添加到系统环境变…

    python 2023年5月20日
    00
  • Python实现针对中文排序的方法

    下面是一份关于如何在Python中实现针对中文排序的攻略。 背景 Python的内置方法sorted()可以排序各种类型的数据,但是针对中文排序,使用默认的排序方法并不能达到期望的结果。因此,为了针对中文进行排序,我们需要使用其他一些方法。 解决方案 有很多方法和库可以实现中文排序,如下所述: 1. 使用locale库 locale库提供了一种可以使用当前系…

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