django实现分页的方法

下面就具体阐述这个问题:

1. Django中实现分页方法的基础知识

1.1 PaginatorPage

Django中提供了Paginator类和Page类来实现分页功能。其中Paginator类负责分页部分逻辑,Page类则用于获取分页后的结果。

Paginator类有两个常用方法:
- Paginator.count属性:获取总数据条数;
- Paginator.num_pages属性:获取总页数。

Page类有三个常用方法:
- Page.object_list属性:获取当前页码的对象列表;
- Page.number属性:获取当前页码;
- Page.has_previous()方法:判断是否有上一页;
- Page.has_next()方法:判断是否有下一页;

1.2 定义视图函数

为了实现分页功能,需要定义一个视图函数。

示例1:基于类视图 ListView 的分页实现方式

from django.core.paginator import Paginator
from django.views.generic import ListView
from myapp.models import MyModel

class MyListView(ListView):
    template_name = 'my_template.html'
    context_object_name = 'my_list'
    paginate_by = 10

    def get_queryset(self):
        return MyModel.objects.all()

通过上述代码我们定义了一个名为MyListView的类,继承了Django内置的ListView类。

其中,template_name属性表示定义渲染的模板文件名,context_object_name属性是用于将模型的查询结果传到模板中并进行渲染。paginate_by属性表示定义每一页的数据条数,这里我们设置为10条。

get_queryset()方法返回查询结果集。

示例2:基于普通视图函数的分页实现方式

from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import MyModel

def my_view(request):
    my_list = MyModel.objects.all()
    paginator = Paginator(my_list, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'my_template.html', {'page_obj': page_obj})

通过上述代码我们定义一个名为my_view的函数,实现了分页的逻辑。

首先,我们查询所有的MyModel模型,然后实例化Paginator类,并将查询结果和每页显示数据条数传入;接着,从请求的查询字符串中获取当前页码,并调用Paginator实例的get_page()方法获取对应页码的分页结果集。

2. Django中实现分页方法的示例代码分析

现在,我们通过两个实例来具体学习Django的分页实现方式。

2.1 示例1:基于类视图 ListView 的分页实现方式

这里,我们使用了一个模型MyModel作为数据来源来展示分页结果。

2.1.1 创建模型

为此,我们创建一个名为MyModel的模型,代码如下:

from django.db import models

class MyModel(models.Model):
    name = models.CharField(max_length=200)
    age = models.IntegerField()

2.1.2 创建数据

通过管理后台新建一些测试数据。

2.1.3 实现类视图

在应用的views.py文件中添加以下代码:

from django.core.paginator import Paginator
from django.views.generic import ListView
from myapp.models import MyModel

class MyListView(ListView):
    template_name = 'my_template.html'
    context_object_name = 'my_list'
    paginate_by = 10

    def get_queryset(self):
        return MyModel.objects.all()

至此,分页实现已完成。接着,我们来编写模板文件my_template.html

2.1.4 编写模板文件

在应用的templates目录下新建模板文件my_template.html,代码如下:

{% extends "base.html" %}

{% block content %}
    <ul>
    {% for obj in page_obj %}
        <li>{{ obj.name }} - {{ obj.age }}</li>
    {% empty %}
        <li>No Data</li>
    {% endfor %}
    </ul>

    <div class="pagination">
      <span class="step-links">
          {% if page_obj.has_previous %}
              <a href="?page=1">&laquo; first</a>
              <a href="?page={{ page_obj.previous_page_number }}">previous</a>
          {% endif %}

          <span class="current-page">
              Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
          </span>

          {% if page_obj.has_next %}
              <a href="?page={{ page_obj.next_page_number }}">next</a>
              <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
          {% endif %}
      </span>
    </div>
{% endblock %}

然后,我们可以在浏览器中访问http://127.0.0.1:8000/my_list来查看分页结果。

2.2 示例2:基于普通视图函数的分页实现方式

同样以MyModel作为数据来源,我们来编写第二个实例。

2.2.1 实现视图函数

在应用的views.py文件中添加以下代码:

from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import MyModel

def my_view(request):
    my_list = MyModel.objects.all()
    paginator = Paginator(my_list, 10)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'my_template.html', {'page_obj': page_obj})

2.2.2 编写模板文件

在应用的templates目录下新建模板文件my_template.html,代码如下:

{% extends "base.html" %}

{% block content %}
    <ul>
    {% for obj in page_obj %}
        <li>{{ obj.name }} - {{ obj.age }}</li>
    {% empty %}
        <li>No Data</li>
    {% endfor %}
    </ul>

    <div class="pagination">
      <span class="step-links">
          {% if page_obj.has_previous %}
              <a href="?page=1">&laquo; first</a>
              <a href="?page={{ page_obj.previous_page_number }}">previous</a>
          {% endif %}

          <span class="current-page">
              Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
          </span>

          {% if page_obj.has_next %}
              <a href="?page={{ page_obj.next_page_number }}">next</a>
              <a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
          {% endif %}
      </span>
    </div>
{% endblock %}

接着,我们运行服务器并在浏览器中访问http://127.0.0.1:8000/my_view来查看分页结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django实现分页的方法 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 使用Python的Django框架实现事务交易管理的教程

    标题:使用Python的Django框架实现事务交易管理的教程 概述 本教程将教您如何使用Python的Django框架实现事务交易管理。Django是一个基于MVC模型的Web框架。通过它,我们可以轻松地搭建起一个Web应用,并实现我们所需要的功能。 环境搭建 在开始本教程前,您需要满足以下条件: Python环境(本教程基于Python 3.x编写) D…

    Django 2023年5月16日
    00
  • Django框架之drf:7、认证组件,权限组件,频率组件,过滤的多种用法,排序,分页,

    Django框架之drf 一、认证组件 简介: ​ 登录认证的限制 ​ 认证组件是drf框架给我们提供的认证接口,它能够在请求进入视图函数/类前进验证(例如:认证用户是否登录),对不符合认证的请求进行拦截并返回校验失败的信息 1、认证组件使用步骤 模块地址: from rest_framework.authentication import BaseAuth…

    2023年4月10日
    00
  • django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

    pip install mysqlclient 在init里 # import pymysql # pymysql.install_as_MySQLdb() import MySQLdb

    Django 2023年4月9日
    00
  • Python Django基础二之URL路由系统

    下面是Python Django基础二之URL路由系统的完整攻略。 1. 什么是URL路由系统 在Django中,URL路由系统就像是一个分配任务的调度员,当用户访问某个URL时,它会把这个请求分发给相应的视图函数进行处理。URL路由系统被设计得非常灵活,可以支持各种不同的URL格式。 2. URL路由系统的配置 Django中的URL路由系统的配置是在ur…

    Django 2023年5月16日
    00
  • django:查询,反向查询

    先看模型: 大的分类(主表) class Category(models.Model): name = models.CharField(max_length=20, null=True) 小的分类(子表) class SmartCategory(models.Model): name = models.CharField(max_length=20, nu…

    Django 2023年4月13日
    00
  • Django之ajax(jquery)封装(包含 将 csrftoken 写入请求头方法)

    由于支持问题,未使用 es6 语法 _ajax.js /** * 发起请求 * @param url 请求地址 * @param data 请求数据 { } json格式 * @param type 请求类型 get|post * @param success 请求成功回调方法(如果支持es6,使用 Promise 更方便) * @param fail 请求…

    Django 2023年4月11日
    00
  • Django框架请求生命周期实现原理

    Django 是一款常用的 Python Web 框架,它使用了 MTV(Model、Template、View) 的设计模式,具有众多的优点和特性。在 Django 中,请求生命周期实现原理非常重要,对于了解和使用 Django 的开发者来说有着至关重要的作用。 Django 的请求生命周期主要分为如下四个阶段: WSGI 应用的初始化 URL 路由匹配 …

    Django 2023年5月16日
    00
  • Django 路由控制的实现

    本文将详细讲解如何在 Django 中实现路由控制。Django 路由控制是一个重要的概念,因为它允许我们将 URL 映射到我们的视图函数,并提供了一种灵活的方式来处理 URL。 什么是 Django 路由控制? Django 路由控制就是将 URL 映射到我们的视图函数,从而将请求分配给正确的处理程序。Django 带有一个名为 urls.py 的模块,它…

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