Django实现分页显示效果

yizhihongxing

下面我将详细讲解如何使用Django实现分页显示效果,包含两个例子。

环境与工具

  • Python 3.x
  • Django 3.x

安装分页插件

Django自带分页,但是功能相对简单,对于一些高级功能可能不够用,这时我们可以使用第三方分页插件:django-pagination,使用pip安装即可:

pip install django-pagination

分页的使用

第一个例子:简单分页

假设我们的网站需要显示一些文章,每页显示5篇,我们需要实现文章的分页。我们以Blog为例:

1. 首先,在Blog应用下的views.py文件中定义视图函数

from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Blog

def blog_list(request):
    all_blogs = Blog.objects.all()
    paginator = Paginator(all_blogs, 5)   # 每页显示5篇文章
    page_number = request.GET.get('page')
    page = paginator.get_page(page_number)
    return render(request, 'blog_list.html', {'page': page})

定义了blog_list函数后,可以访问模板'blog_list.html'来显示分页后的文章列表。

其中,all_blogs是所有Blog对象组成的QuerySet。

django.core.paginator模块中的Paginator类接收两个参数:需要分页的对象(一个QuerySet对象)和每页显示的数量。上面的分页方式每页显示5条文章。

request.GET.get('page')用来获取GET请求的页面,如果没有获取到,则默认显示第一页。

paginator.get_page用来获取指定页面的内容。

2. 然后,在Blog应用下的templates目录下新建模板文件blog_list.html

{% extends 'base.html' %}

{% block content %}
<h2>Blog List</h2>
{% for blog in page %}
    <h3>{{ blog.title }}</h3>
    <p>{{ blog.content }}</p>
{% empty %}
    <p>No blogs.</p>
{% endfor %}

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

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

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

在模板中,我们使用for循环遍历当前页的所有Blog对象,然后如果没有查询到任何Blog对象,则输出"No blogs."。

这个模板的重点是分页的代码,使用page.has_previouspage.has_nextpage.previous_page_numberpage.next_page_numberpage.paginator.num_pages来实现上一页、下一页、第一页、最后一页等功能。

page.has_previous如果为True,表示当前页存在前一页面。page.has_next如果为True,表示当前页存在后一页面。page.previous_page_number表示前一页面的页码。page.next_page_number表示后一页面的页码。page.paginator.num_pages表示总的页面数。

最后,使用paginate对象的方法paginator.page_range,可以得到当前分页的页码列表。

第二个例子:ajax异步分页

现在很多网站都喜欢用ajax实现异步分页,下面提供一种简单的方法。

1. 首先,在Blog应用下的views.py文件中定义视图函数

from django.shortcuts import render
from django.core.paginator import Paginator
from .models import Blog 

def blog_list_ajax(request):
    all_blogs = Blog.objects.all()  # 查询所有Blog对象

    paginator = Paginator(all_blogs, 5)  # 每页显示5篇文章

    try:
        page = int(request.GET.get("page"))
    except:
        page = 1

    # 对超过总页码数的页码进行处理
    if page > paginator.num_pages:
        page = paginator.num_pages

    if page < 1:
        page = 1

    current_page = paginator.page(page)

    return render(request, 'blog_list_ajax.html', {
        'current_page': current_page,
        'paginator': paginator,
        'blogs': current_page.object_list
    })

这里我们定义了blog_list_ajax函数,用于返回ajax异步加载的分页数据。

在这个函数里,我们首先查询出所有Blog对象,并且使用paginator对象来分页,每页显示5篇文章。然后,我们通过GET请求的参数获取当前页码,如果没有获取到,则默认显示第一页。之后,我们对当前页码进行一些处理,如判断当前页码是否超出总页码数的范围,如果超出则指定为最后一页。

最后,我们传递三个参数给模板,current_page是当前页码,paginator是paginator对象,blogs是当前页显示的Blog对象的列表。

2. 然后,在Blog应用下的templates目录下新建模板文件blog_list_ajax.html

{% extends 'base.html' %}

{% block content %}
<h2>Blog List AJAX</h2>

<div id="blog-list">
    {% for blog in blogs %}
        <h3>{{ blog.title }}</h3>
        <p>{{ blog.content }}</p>
    {% empty %}
        <p>No blogs.</p>
    {% endfor %}
</div>

{% if current_page.has_other_pages %}
    <nav class="blog-pagination">
        {% if current_page.has_previous %}
            <input class="prev-page" type="button" value="Prev" data-url="?page={{ current_page.previous_page_number }}" />
        {% endif %}

        <span>
            Page {{ current_page.number }} of {{ current_page.paginator.num_pages }}.
        </span>

        {% if current_page.has_next %}
            <input class="next-page" type="button" value="Next" data-url="?page={{ current_page.next_page_number }}" />
        {% endif %}
    </nav>
{% endif %}

{% endblock %}

{% block js %}
<script>
    $(document).ready(function() {
        $('.blog-pagination input').click(function(event) {
            var url = $(this).data('url');
            $.get(url, function(html) {
                $('#blog-list').html($(html).find('#blog-list').html());
            })
        });
    });
</script>
{% endblock %}

在这个模板中,我们使用了jQuery来异步加载分页数据。首先,我们用一个id为blog-list的div来包裹所有Blog对象的列表。然后,在分页的代码中,我们使用了当前页的has_previoushas_next属性来判断是否存在前一页和后一页。如果存在,则给两个按钮添加data-url属性表示下一页或上一页。

最后,我们使用jQuery的get方法异步请求后端数据,获取新的HTML代码,然后将此代码的blog-list部分插入到我们的页面中(使用empty方法清空当前页之后插入新的分页内容)。

至此,我们已经讲解了使用Django实现分页显示效果的两个例子,详细讲解了如何安装和使用第三方分页插件django-pagination,并展示了两种使用分页插件的方法,一种是简单分页方式,一种是ajax异步分页方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django实现分页显示效果 - Python技术站

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

相关文章

  • Django—Form两种保留用户提交数据的方法

    用户在网页上进行表单填写时,有可能出现某项填写错误。一般情况下,用户在未发觉错误的情况下点击提交,则此表单的内容会清空,用户不得不再重新填写,这样的用户体验是及其糟糕的。 在此,我们有2种方法将用户的输入保存下来,一旦填写错误,只需要将错误项修改即可重新提交。 一、利用Form生成Html标签 1. views.py 1 from django.shortc…

    Django 2023年4月10日
    00
  • Django Admin后台管理系统是什么?如何使用?

    Django Admin后台管理系统是什么? Django是一个高级Web框架,提供了一系列组件和工具,帮助开发人员快速开发高质量的Web应用程序。 其中,Django Admin是Django框架的一个常用组件之一,提供了一个易于使用的后台管理系统,方便了用户管理数据和应用程序的操作。 简单来说,Django Admin后台管理系统就是一个Web应用程序的…

    2023年3月11日
    00
  • django前后端交互

    前后端交互的方式有两种,一种是自己写个html页面,插入数据,一种是使用django自带的后台管理,插入数据 下面介绍方式1: post.html <!DOCTYPE html> <html lang=”en”> <head> <meta charset=”UTF-8″> <title>Title&…

    Django 2023年4月13日
    00
  • 学点简单的Django之第一个Django程序的实现

    下面我会给出学习Django的第一个程序实现的完整攻略,并配以两条示例说明: 第一步:安装并创建Django项目 安装Django:在命令行中输入指令:pip install django; 创建Django项目:在命令行中输入指令:django-admin startproject mysite。 执行完以上两个步骤后,你就已经成功创建了一个Django项…

    Django 2023年5月16日
    00
  • Django实现文件上传下载功能

    下面我将为你详细讲解“Django实现文件上传下载功能”的完整攻略,包含以下两部分内容: 文件上传功能实现步骤 首先,在Django项目中创建一个文件上传的视图,可以在views.py中创建: from django.shortcuts import render from django.http import HttpResponse def upload…

    Django 2023年5月15日
    00
  • Django缓存系统实现过程解析

    Django缓存系统实现过程解析 Django缓存系统可以有效地提高网站的性能和响应速度。在这篇文档中,我们将详细讲解Django缓存系统的实现过程以及两条示例说明。 什么是Django缓存系统? Django缓存系统是一个用于缓存网站的数据的框架。它能够存储重要的数据,比如数据库查询结果、计算结果等等,以便在需要时可以快速地访问。使用缓存系统能够减少用户的…

    Django 2023年5月16日
    00
  • django rest_framework

    Django REST framework is a powerful and flexible toolkit for building Web APIs. The Web browsable API is a huge usability win for your developers. Authentication policies including…

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