📜  如何在 Django 项目中添加分页?(1)

📅  最后修改于: 2023-12-03 15:24:09.683000             🧑  作者: Mango

如何在 Django 项目中添加分页?

分页是一种常见的需求,它可以将大量数据分割成多个页面,方便用户查看。在 Django 项目中添加分页也是非常简单的,下面就为大家介绍一下。

安装 Django 分页组件

Django 内置了分页组件,我们可以直接使用。如果你使用的是 Django 1.8 或更早版本,需要安装 django-pagination 插件。

pip install django-pagination
在视图函数中使用分页组件

在视图函数中使用分页组件非常简单,我们只需要引入分页组件即可。假设我们有一个 Entry 模型,它包含了很多条记录,我们希望将这些记录分页展示。这时候,我们可以这么写:

from django.core.paginator import Paginator

def entry_list(request):
    entry_list = Entry.objects.all()
    paginator = Paginator(entry_list, 10) # 每页展示10条数据

    page = request.GET.get('page')
    entries = paginator.get_page(page)

    return render(request, 'entry_list.html', {'entries': entries})

其中,entry_list 是查询出来的所有记录,Paginator 的第一个参数是数据集合,第二个参数是每页展示的数量。request.GET.get('page') 表示获取 GET 请求中的页码参数,最后通过 paginator.get_page() 方法获取对应页码的数据集合,返回给模板展示。

在模板中使用分页组件

我们已经在视图函数中获取了分页之后的数据,下面就需要在模板中进行展示。展示分页的数据通常有两个步骤:

  1. 显示当前页面的数据。
  2. 显示分页链接。

这里以 Bootstrap 4 为例子,演示如何实现分页展示:

{% if entries %}
<ul>
  {% for entry in entries %}
  <li>{{ entry.name }}</li>
  {% endfor %}
</ul>
{% endif %}

{% if entries.has_other_pages %}
<nav aria-label="Page navigation example">
  <ul class="pagination">
    {% if entries.has_previous %}
    <li class="page-item">
      <a class="page-link" href="?page=1" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
        <span class="sr-only">Previous</span>
      </a>
    </li>
    <li class="page-item"><a class="page-link"
        href="?page={{ entries.previous_page_number }}">{{ entries.previous_page_number }}</a></li>
    {% else %}
    <li class="page-item disabled">
      <a class="page-link" href="#" aria-label="Previous">
        <span aria-hidden="true">&laquo;</span>
        <span class="sr-only">Previous</span>
      </a>
    </li>
    {% endif %}

    {% for i in entries.paginator.page_range %}
    {% if entries.number == i %}
    <li class="page-item active"><a class="page-link" href="#">{{ i }}</a></li>
    {% else %}
    <li class="page-item"><a class="page-link" href="?page={{ i }}">{{ i }}</a></li>
    {% endif %}
    {% endfor %}

    {% if entries.has_next %}
    <li class="page-item"><a class="page-link"
        href="?page={{ entries.next_page_number }}">{{ entries.next_page_number }}</a></li>
    <li class="page-item">
      <a class="page-link" href="?page={{ entries.paginator.num_pages }}" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
        <span class="sr-only">Next</span>
      </a>
    </li>
    {% else %}
    <li class="page-item disabled">
      <a class="page-link" href="#" aria-label="Next">
        <span aria-hidden="true">&raquo;</span>
        <span class="sr-only">Next</span>
      </a>
    </li>
    {% endif %}
  </ul>
</nav>
{% endif %}

这里的模板中,首先判断是否有当前页展示的数据,如果有,则进行展示。然后展示页码链接,根据 entries 对象的属性,我们可以很方便地获取上一页和下一页的页码,以及总页数。最后,根据 Bootstrap 4 的分页组件样式,通过模板语法渲染出具有分页效果的页面。

总结

到这里,我们就完成了在 Django 项目中添加分页的操作。通过这篇文章的学习,相信大家对 Django 分页组件的使用也已经有了一定的了解。如果您还有其他问题,可以查阅 Django 官方文档,或者在社区寻求帮助。