让我们来详细讲解如何使用Django的Paginator插件实现翻页功能的实例。
什么是Paginator插件
Paginator插件是Django自带的一个分页插件,可以方便地实现在查询数据时将结果按照指定条数进行分页显示,并提供了一个简单的分页导航栏,让用户方便快捷地在不同页面间进行切换。
Paginator插件的使用步骤
下面我们来一步一步地讲解如何使用Paginator插件实现翻页功能。
1.在视图函数中获取数据
首先,在视图函数中完成需要进行分页的数据集合,并将其传递给Paginator。
如下代码示例,我们假设已经从数据库中获取了数据,通过QuerySet
将查询集传递给Paginator:
from django.core.paginator import Paginator
def my_view(request):
queryset = MyModel.objects.all()
paginator = Paginator(queryset, 10) # 将查询集传递给Paginator,设置每页显示10条记录
page = request.GET.get('page') # 获取 GET 请求中的 page 参数,确定当前页码
results = paginator.get_page(page) # 获取对应页面的数据
return render(request, 'my_template.html', {'results': results})
2.将结果传递给模板
接下来,在模板中使用Paginator提供的标签和方法显示数据。
Paginator提供了两个模板标签:{% paginator %}
和{% autopaginate %}
。
{% paginator %}
标签用来显示分页导航栏,并接受一个可选的参数,用来指定显示页码的数量。
{% autopaginate %}
标签是一个自动分页标签,可以将结果按照每页显示数量进行自动分页,并且返回一个分页对象。
{% extends 'base.html' %}
{% block content %}
{% autopaginate results 10 %}
{% for obj in results %}
<!-- 在这里显示数据 -->
<p>{{obj.title}}</p>
{% empty %}
<!-- 如果数据为空 -->
<p>No records found!</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if results.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ results.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ results.number }} of {{ results.paginator.num_pages }}
</span>
{% if results.has_next %}
<a href="?page={{ results.next_page_number }}">next</a>
<a href="?page={{ results.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endblock %}
在模板中,我们使用了{% autopaginate %}
标签将数据对象results
根据每页显示10条的规则进行分页,并将分页对象赋值给results
变量。在{% for %}
循环中展示所有数据,如{{ obj.title }}
。
在分页导航栏中,我们展示了一些链接,如“下一页”,“上一页”等等,这些链接用来帮助用户进行页面的切换。我们使用了模板标签{% paginator %}
来显示这个导航栏。
当用户点击这些链接时,GET请求带上的参数page
将会用来决定下一次请求应该显示哪个页面的数据。在视图函数中,我们通过request.GET.get('page')
获取当前页面的页码。
3.在URL中添加页码参数
最后,在URL配置中添加一个正则表达式允许在URL中添加页码参数,如下所示:
from django.urls import path
from my_app.views import my_view
urlpatterns = [
path('my-view/<int:page>/', my_view, name='my-view'),
]
这使得使用者可以通过类似于 http://example.com/my-view/2/
的 URL访问不同的页面。
好了,到此为止,我们就完成了Paginator插件的使用,用户可以方便地在分页列表中进行切换、浏览数据。同时我们的程序实现了当数据总数发生改变时仍然能够自动进行分页显示的功能。
示例说明
下面我们来看两个示例,分别是根据page
参数获取数据集合和基于request.GET
获取数据集合。
示例一:根据page
参数获取数据集合
假设我们有一个Product
模型,我们想要将所有产品按照每页5条记录的规则进行分页。
我们可以在视图函数views.py
中添加以下代码:
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Product
def product_list(request):
product_list = Product.objects.all()
paginator = Paginator(product_list, 5)
page = request.GET.get('page')
products = paginator.get_page(page)
return render(request, 'product_list.html', {'products': products})
在模板中,我们使用了简单的for循环来遍历分页后的数据结果,并且使用{% if %}
判断是否存在上一页或者下一页:
{% extends 'base.html' %}
{% block content %}
{% for product in products %}
<h2>{{ product.name }}</h2>
<p>{{ product.description }}</p>
{% empty %}
<p>No products found.</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if products.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ products.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ products.number }} of {{ products.paginator.num_pages }}
</span>
{% if products.has_next %}
<a href="?page={{ products.next_page_number }}">next</a>
<a href="?page={{ products.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endblock %}
示例二:基于request.GET
获取数据集合
在这个示例中,我们将使用一个搜索表单来演示如何对数据进行搜索,并将搜索结果按照每页10条记录的规则进行分页。
首先,在视图函数中,我们要获取表单数据并将其传递给Paginator:
from django.core.paginator import Paginator
from django.shortcuts import render
from .models import Product
def product_search(request):
query = request.GET.get('q')
qs = Product.objects.filter(name__icontains=query)
paginator = Paginator(qs, 10)
page = request.GET.get('page')
products = paginator.get_page(page)
return render(request, 'product_search.html', {'products': products})
我们使用了Django的QuerySet API来进行模糊查询,并且将查询结果传递给Paginator。
在模板中,我们使用了一个搜索表单,和上一个示例中类似,我们将分页后的数据对象传递给模板,使用简单的for
循环来遍历数据记录:
{% extends 'base.html' %}
{% block content %}
<form action="" method="GET">
<input type="text" name="q">
<button type="submit">Search</button>
</form>
{% if products %}
{% for product in products %}
<h2>{{ product.name }}</h2>
<p>{{ product.description }}</p>
{% empty %}
<p>No products found.</p>
{% endfor %}
<div class="pagination">
<span class="step-links">
{% if products.has_previous %}
<a href="?page=1&q={{ request.GET.q }}">« first</a>
<a href="?page={{ products.previous_page_number }}&q={{ request.GET.q }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ products.number }} of {{ products.paginator.num_pages }}
</span>
{% if products.has_next %}
<a href="?page={{ products.next_page_number }}&q={{ request.GET.q }}">next</a>
<a href="?page={{ products.paginator.num_pages }}&q={{ request.GET.q }}">last »</a>
{% endif %}
</span>
</div>
{% endif %}
{% endblock %}
这个示例的关键在于如何兼容原始查询,我们将11行添加到了模板链接中,以确保用户输入的查询参数能够正确地被传递给下一页的链接中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django使用paginator插件实现翻页功能的实例 - Python技术站