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日

相关文章

  • web之django的序列化器汇总

      django的rest_framework的一大特色是序列化器,其封装了视图中关于用户请求,验证及响应数据的处理部分,使得程序简洁化。此DRF框架中将数据模型对象转化为json、xml等可传输或存档的格式的过程称为序列化,反之称为反序列化。序列化器是专注于此类行为的类,有自定义序列化器,模型类序列化器,视图集合三类。 1.视图函数 2.类视图   1.自…

    Django 2023年4月12日
    00
  • 浅谈django orm 优化

    浅谈Django ORM 优化 Django ORM(对象关系映射)是Django的核心组件之一,用于在Python中简化数据库的CRUD操作。但是,在处理大量数据或复杂查询时,ORM的性能可能会变得缓慢。因此,本文将介绍在Django应用程序中使用ORM时可以使用的一些优化技巧。 延迟查询 当使用objects.get()或objects.filter()…

    Django 2023年5月16日
    00
  • Python – Django – ORM Django 终端打印 SQL 语句

    在 settings.py 中添加以下内容: LOGGING = { ‘version’: 1, ‘disable_existing_loggers’: False, ‘handlers’: { ‘console’:{ ‘level’:’DEBUG’, ‘class’:’logging.StreamHandler’, }, }, ‘loggers’: { ‘…

    Django 2023年4月10日
    00
  • django,inspectdb,操作已经存在的表

    1.Django附带了一个名为inspectdb程序,它可以通过现有数据库来创建模型,并将相关模型代码另存到指定文件中。在新建的newmodels.py文件中挑选指定表格对应的模型代码,并将其复制到相关的文件中。 1 python manage.py inspectdb > newmodels.py 若要操作指定数据库,使用如下代码: 1 python…

    Django 2023年4月12日
    00
  • python框架Django实战商城项目之工程搭建过程图文详解

    下面是详细讲解“Python框架Django实战商城项目之工程搭建过程图文详解”的完整攻略,包含两条示例说明。 概述 本攻略主要讲解如何使用Python框架Django实现商城网站的工程搭建过程,包括安装Django、创建项目、创建应用、配置数据库、创建模型、迁移数据库等步骤。通过这个过程,你可以了解到Django的基本框架、MVC架构、ORM和数据库等相关…

    Django 2023年5月16日
    00
  • 基于Django框架的权限组件rbac实例讲解

    下面是基于Django框架的权限组件rbac实例讲解的完整攻略以及两条示例说明: 基于Django框架的权限组件rbac实例讲解 什么是权限组件rbac rbac即Role-Based Access Control,它是一种基于角色的访问控制机制。在web开发中,常见的权限组件包括django-guardian、django-rules等,而本文将着重讲解基…

    Django 2023年5月16日
    00
  • Django Blog开发v1.0

    版本:1.0 版本说明: 1) 大部分来源于http://www.cnblogs.com/cacique/archive/2012/09/29/2707976.html 2) 自己测试用,使用svn比较方便   以下详细步骤 1. create foldermysite2 2. cmd to  mysite2django-admin.py startproj…

    Django 2023年4月13日
    00
  • Anaconda+django写出第一个web app(十一)

    今天我们来学习给页面添加一个Sidebar,根据Sidebar跳转到相应的tutorial。 打开views.py,编辑single_slug函数: def single_slug(request, single_slug): categories = [c.category_slug for c in TutorialCategory.objects.al…

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