django实现分页的方法

yizhihongxing

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

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日

相关文章

  • Django中ORM的基本使用教程

    下面我会详细讲解Django中ORM的基本使用教程和两个示例。 ORM简介 ORM全称是Object-Relational Mapping,即对象关系映射,它是一种程序设计技术,用于实现面向对象程序语言与关系数据库之间的映射。在ORM中,每一个数据表映射为一个类,每一条记录映射为类的一个实例。 在Django中,ORM支持各种关系型数据库,如MySQL、Po…

    Django 2023年5月16日
    00
  • 【网络开发】WeX5的Ajax和Django服务器json接口对接跨域问题解决

    问题背景 WeX5是典型的html5+js架构。源文件全部放到服务器的UI Server中,使用通用的tomcat,例如使用域名www.wuyoubar.cn:8080/x5。 Android和IOS的服务器端Django已经实现了json的处理,json的主域名www.wuyoubar.cn:80 PC访问WeX5页面。避免重复进行数据处理,WeX5的JS…

    Django 2023年4月13日
    00
  • Django——REST framework Django REST framework

    1. 什么是REST REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 所有的数据,不过是通过网络…

    Django 2023年4月10日
    00
  • 详解Django的信号机制

    Django信号是一个事件触发机制。当某些事情发生时,比如模型保存,信号将被触发,并执行注册的处理函数。信号机制可以帮助我们在Django应用程序中实现解耦和扩展性。 本文将详细介绍Django信号机制的完整攻略,包括信号的定义、注册和处理函数等。 定义信号 Django中的信号被定义在signals.py文件中。下面是一个简单的示例: from djang…

    Django 2023年3月13日
    00
  • django项目启动时报 ‘str’ object has no attribute ‘decode’

    今天在启动django项目是报错AttributeError: ‘str’ object has no attribute ‘decode’, 项目连接数据库时,出现这个错误,报错截图 处理过程:   点击最后一个报错信息,进入到下面这个页面    处理结果:   将上图用红色印记圈起来的代码直接注释掉,或者将代码里面的decode直接变为encode,这样…

    Django 2023年4月11日
    00
  • Django基础知识与基本应用入门教程

    下面是Django基础知识与基本应用入门教程的完整攻略: 安装Django 你可以使用以下命令来安装Django: pip install Django 创建Django项目 使用以下命令来创建一个Django项目: django-admin startproject myproject 其中,”myproject”是你的项目名称。 创建Django应用 在…

    Django 2023年5月16日
    00
  • Django后端项目—-RESTful API

     一. 什么是RESTful  REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态 所有的数据,不管…

    Django 2023年4月12日
    00
  • Django中login_required装饰器的深入介绍

    下面是关于“Django中login_required装饰器的深入介绍”的完整攻略: 登录验证 在Web开发中,很多功能都需要用户登录之后才能使用。在Django中,我们通过django中内置的装饰器login_required来实现这个功能。 使用login_required装饰器可以很方便的验证用户是否登录。如果未登录,装饰器会将请求重定向到登录页面。 …

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