详解Django的 paginate_by() 函数:指定每页显示的数量

  • Post category:Python

paginate_by()函数是Django框架中的一个分页函数,可以帮助我们实现分页功能。它可以将一个查询集对象分页展示,并提供一些基本的分页控制。通过启用paginate_by()函数,我们可以将查询结果分页展示,而不是将所有结果放在同一个页面上,方便用户浏览和操作。

使用方法:

1.导入 PaginationMixin 类
首先,你需要从 Django 分页 API 中导入 PaginationMixin 类,

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

2.实例化 Paginator 类
可以通过 Paginator 类将一个查询集对象分页展示,Paginator 类的核心是 pagination() 函数,它可以将查询结果分页展示。

paginator = Paginator(queryset, 10)  # 每页展示10条记录

3.在视图中使用 paginate_by()
接下来,在视图中,我们需要使用 paginate_by() 函数来启用分页。paginate_by() 函数将查询结果分成一页一页。例如,我们要展示一些博客文章,每一页展示10篇文章,那么视图代码可能类似这个样子:

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render

def blog_list(request):
    queryset_list = Blog.objects.all() # 查询所有博客文章
    paginator = Paginator(queryset_list, 10) # 每页展示10篇文章
    page = request.GET.get('page')
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        queryset = paginator.page(1)
    except EmptyPage:
        queryset = paginator.page(paginator.num_pages)

    context = {
        "object_list": queryset,
        "page_request_var": "page",
    }
    return render(request, "blog_list.html", context)

在视图函数中,我们首先使用“GET”请求从 URL 中获取“page”参数,然后使用 Paginator 类将查询集对象分页展示,最后将获取到的每一页文章展示在模板中。

实例1:使用 paginate_by() 函数在博客文章的列表页面展示分页功能

# models.py
from django.db import models

class Blog(models.Model):
    title = models.CharField(max_length=255)
    content = models.TextField()

# views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
from .models import Blog

def blog_list(request):
    queryset_list = Blog.objects.all() # 查询所有博客文章
    paginator = Paginator(queryset_list, 5) # 每页展示5篇文章
    page = request.GET.get('page')
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        queryset = paginator.page(1)
    except EmptyPage:
        queryset = paginator.page(paginator.num_pages)

    context = {
        "object_list": queryset,
        "page_request_var": "page",
    }
    return render(request, "blog_list.html", context)

在模板文件中,我们遍历每一页文章:

{% for obj in object_list %}
  <h2><a href="#">{{ obj.title }}</a></h2>
  <p>{{ obj.content }}</p>
{% endfor %}

<!-- 显示分页 -->
{% if object_list.has_other_pages %}
  <ul class="pagination">
    {% if object_list.has_previous %}
      <li><a href="?page=1">&laquo;</a></li>
      <li><a href="?page={{ object_list.previous_page_number }}">&lsaquo;</a></li>
    {% endif %}
    {% for i in object_list.paginator.page_range %}
      {% if object_list.number == i %}
        <li class="active"><a href="#">{{ i }} <span class="sr-only">(current)</span></a></li>
      {% else %}
        <li><a href="?page={{ i }}">{{ i }}</a></li>
      {% endif %}
    {% endfor %}
    {% if object_list.has_next %}
      <li><a href="?page={{ object_list.next_page_number }}">&rsaquo;</a></li>
      <li><a href="?page={{ object_list.paginator.num_pages }}">&raquo;</a></li>
    {% endif %}
  </ul>
{% endif %}

实例2:使用 paginate_by() 函数在用户信息列表中展示分页功能

# models.py
from django.contrib.auth.models import User

# views.py
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.shortcuts import render
from django.contrib.auth.models import User

def user_list(request):
    queryset_list = User.objects.all() # 查询所有用户
    paginator = Paginator(queryset_list, 15) # 每页展示15条用户记录
    page = request.GET.get('page')
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        queryset = paginator.page(1)
    except EmptyPage:
        queryset = paginator.page(paginator.num_pages)

    context = {
        "object_list": queryset,
        "page_request_var": "page",
    }
    return render(request, "user_list.html", context)

在用户列表的模板文件中,我们可以遍历每一页的用户信息:

{% for obj in object_list %}
  <tr>
    <td>{{ obj.id }}</td>
    <td>{{ obj.username }}</td>
    <td>{{ obj.email }}</td>
    <td>{{ obj.last_login }}</td>
    <td>{{ obj.date_joined }}</td>
  </tr>
{% endfor %}

总之,paginate_by() 函数可以帮助我们轻松地实现分页功能,通过以上示例,你可以了解该函数的使用方法以及在实际项目中的运用技巧。