Django实现分页显示效果

下面我将详细讲解如何使用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的安装、使用详解、自动化测试应用以及程序打包

    1、Django的安装 pip install Django 验证 Django 是否能被 Python 识别 >>> import django >>> print(django.get_version()) 2.2.6 2、创建Django项目脚手架(里面mysite 是Django容器) cd 到一个你想放置你代码的…

    Django 2023年4月13日
    00
  • django修改静态文件(css,js)之后,浏览器效果没改变

    今天踩了一个大坑,静态文件(css,js)之后,浏览器效果没改变 按F12查需要改变的元素引用的css标签发现并没有改变。说明浏览器对于css,js文件有缓存。需要手动清除一下!!!           在设置里面清理缓存即可  

    Django 2023年4月11日
    00
  • Django零基础入门之路由path和re_path详解

    我将详细讲解“Django零基础入门之路由path和re_path详解”的完整攻略,包括两条示例说明。 什么是Django路由? Django路由是负责将 URL 转化为视图的函数或方法的机制。路由将 URL 映射到相应的视图上,以处理用户发出的请求。 Django路由规则都存储在每一个应用的 urls.py 文件中。 path路由 在 Django 2.0…

    Django 2023年5月16日
    00
  • 基于Django用户认证系统详解

    下面是关于“基于Django用户认证系统详解”的完整攻略,包含两条示例说明。 什么是Django用户认证系统? Django用户认证系统是Django框架提供的一个内置模块,它可以帮助我们轻松地实现用户认证、授权和管理等功能。 Django用户认证系统的使用 准备工作 首先,我们需要创建一个Django项目,并且在settings.py文件中将’django…

    Django 2023年5月16日
    00
  • Django Auth应用实现用户身份认证

    Django Auth应用是Django官方提供的一个用户认证应用,可以用于实现用户的注册、登录、注销等功能。本文将介绍如何使用Django Auth应用实现用户身份认证的完整方法。 安装Django Auth应用 首先需要安装Django Auth应用,可以使用pip安装: pip install django-auth 或者在项目的requirement…

    Django 2023年3月12日
    00
  • django-redis 中文文档

    Andrey Antukh, niwi@niwi.be 4.7.0 翻译: RaPoSpectre 1. 介绍 django-redis 基于 BSD 许可, 是一个使 Django 支持 Redis cache/session 后端的全功能组件. 1.1 为何要用 django-redis ? 因为: 持续更新 本地化的 redis-py URL 符号连接…

    Django 2023年4月11日
    00
  • Django中url name

    花了好长时间才明白这个name参数的含义。便写下来了备忘 当我们在url的时候,一般情况下都是使用很明确的url地址。如在网页里面使用<a href=”/login”>登录</a>.像这样的链接有很 多。假如有一天,突然需要改变登录的链接,想将/login变成/login_first 这样的话,就需要将url里面的正则改变成 ^log…

    Django 2023年4月11日
    00
  • Django for标签详解

    Django的for标签是一种方便的循环机制,它允许我们在模板中迭代指定的可迭代对象,例如Python中的列表、元组和字典。在循环过程中,我们可以使用for标签定义计数器,以便在模板中进行操作。 下面我们将详细介绍Django for标签的用法,并提供示例代码。 for标签的语法格式如下: {% for item in iterable %} … # 循…

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