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日

相关文章

  • DJango之model_to_dict

    导包:from django.forms import model_to_dict 作用:将queryset类型数据转换成字典 def get(self, request, *args, **kwargs): pk = kwargs.get(‘pk’) print(request.GET.dict()) if pk: que = model_to_dict(…

    Django 2023年4月11日
    00
  • Django Form表单自定义验证规则

    Django Form表单自定义验证规则是开发中常用的功能之一,本文将详细介绍如何自定义验证规则,包括如何定义验证方法并将其添加到表单中,以及如何在视图中使用表单进行数据验证。 定义验证方法 要自定义表单验证规则,首先需要定义一个验证方法。这个方法应该以表单字段的值为参数,并返回布尔值,指示该值是否有效。例如: def validate_even(value…

    Django 2023年3月12日
    00
  • Django基于Models定制Admin后台实现过程解析

    下面我将详细讲解 “Django基于Models定制Admin后台实现过程解析”的完整攻略。在实现过程中,我们将使用两个示例来说明。 1. 简介 Django是一款使用Python语言编写的开源Web框架,其主要目的是快速开发可维护的Web应用程序。Django提供了一组工具和库,使得开发Web应用程序变得简单和高效。其中之一就是Django Admin,它…

    Django 2023年5月16日
    00
  • 使用Django2.0打造小程序助手

    打造个人助手 主角: Django2.0 微信小程序(2017年元旦发布) 技术要求: python3开发基础 Django开发基础 HTML+CSS+JS 开发环境: Python开发环境:Python3.5+pycharm 小程序开发环境:微信开发者工具 系统开发环境:Windows(开发)+linux(部署) 依赖环境&工具 Postman(模…

    Django 2023年4月9日
    00
  • Django 1.8 admin 产生’WSGIRequest’ object has no attribute ‘user’的错误

        配置admin时,产生’WSGIRequest’ object has no attribute ‘user’的错误   google了下,说是MIDDLEWARE配置的有问题,顺序应该保持参见(http://stackoverflow.com/questions/26576192/wsgirequest-object-has-no-attribut…

    Django 2023年4月15日
    00
  • 第二章:2.8 通过Django 在web页面上面输出 “Hello word ”

    1. 第一步:配置 guest 目录下面的 settings.py 文件, 将 sign应用添加到 guest项目中。                     2. 在 guest目录下面,打开 urls.py 文件,添加 要打开的路由文件配置       3. 在sign应用的目录中找到:views.py 添加 index 函数       4. 使用 模…

    Django 2023年4月12日
    00
  • 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example原作者:Antonio Melé 2016年12月10日发布(没有进行校对,有很多错别字以及模糊不清的语句,请大家见谅) 2017年2月7日精校完成(断断续续的终于完成了第一章精校,感觉比直接翻译还要累,继续加油) 2017年2月10日再次…

    Django 2023年4月11日
    00
  • Django 构建模板form表单的两种方法

    下面我将详细讲解Django构建模板form表单的两种方法,并提供两个示例。 方法一:使用Django模板默认的form表单 Django模板默认提供了form表单的渲染,方便我们快速地渲染出一个表单。 使用此方法时,需要在视图函数中定义一个form变量,并为其赋值为一个forms.Form对象(也可以是子类或其他表单类)。然后在模板中,使用form.as_…

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