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日

相关文章

  • Centos环境部署django项目的全过程(永久复用)

    下面我将详细讲解Centos环境部署Django项目的全过程,并为您提供两个示例。 环境准备 首先需要安装CentOS操作系统,建议使用最新版本的CentOS 8。接着需要安装Python,由于Django项目需要Python2.x或Python3.x版本,建议安装Python3.x版本。通过以下命令安装Python3.x: sudo yum install…

    Django 2023年5月16日
    00
  • on_delete django之ORM操作之Foreignkey

    on_delete指的是通过ForeignKey连接起来的对象被删除后,当前字段怎么变化。 常见的选项有:   models.CASCADE,对就对象删除后,包含ForeignKey的字段也会被删除   models.PROTECT,删除时会引起ProtectedError   models.SET_NULL,注意只有当当前字段设置null设置为True才有…

    Django 2023年4月10日
    00
  • django如何自定义manage.py管理命令

    在Django开发过程中,我们常常需要执行一些自定义的管理命令,例如批量导入数据、生成测试数据等。Django提供了一个命令行工具manage.py,我们可以通过自定义命令来扩展其功能。下面是自定义manage.py命令的完整攻略: 1. 创建自定义命令 首先,我们需要创建一个新的命令文件。在项目根目录下创建一个management/commands文件夹,…

    Django 2023年5月16日
    00
  • 用Python的Django框架编写从Google Adsense中获得报表的应用

    首先让我们来讲解一下用Python的Django框架编写从Google Adsense中获得报表的应用的完整攻略。 1.准备工作 在开始编写应用程序之前,您需要准备以下工具和框架: Python 3.6+ Django 2.x Google Adsense API Google OAuth2认证 2.创建Google OAuth2应用程序 在项目开发之前,首…

    Django 2023年5月16日
    00
  • Django 使用VScode 创建工程的详细步骤

    下面是详细的步骤和两个示例: 安装VSCode和Python环境 在开始Django项目之前,首先需要安装VSCode和Python环境。 下载和安装VSCode。 下载和安装Python,注意版本应该是3.x系列。 创建Django项目 打开VSCode,创建一个新的工作空间。 使用以下命令创建Django项目(假设项目名为myproject): pyth…

    Django 2023年5月16日
    00
  • Django框架的理解和使用的常见问题

    1、什么是中间件? 中间件是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出。 中间件一般做认证或批量请求处理,django中的中间件,其实是一个类,在请求和结束后,django会根据自己的规则在合适的时机执行中间件中相应的方法。 如请求过来 执行process_request, view,…

    Django 2023年4月10日
    00
  • django的form常用字段和参数

    Django 的内置字段 Field required=True#请求不能为空 widget=None#HTML插件 label=None#用于生成lable标签或显示内容 initial=None#初始值 help_text=”#帮助信息(在标签旁边显示) error_messages=None#(错误信息{‘required’:’不能为空’,‘inva…

    Django 2023年4月13日
    00
  • Django项目后台不挂断运行的方法

    下面是详细讲解“Django项目后台不挂断运行的方法”的攻略: 方法一:使用Supervisor Supervisor是一个用Python编写的进程管理工具。通过在系统中安装Supervisor,我们可以将Django项目的Web服务器后台运行并在系统崩溃或关闭时继续运行。 安装Supervisor 通过包管理器安装Supervisor,例如在Debian/…

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