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">«</a></li>
<li><a href="?page={{ object_list.previous_page_number }}">‹</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 }}">›</a></li>
<li><a href="?page={{ object_list.paginator.num_pages }}">»</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() 函数可以帮助我们轻松地实现分页功能,通过以上示例,你可以了解该函数的使用方法以及在实际项目中的运用技巧。