下面就具体阐述这个问题:
1. Django中实现分页方法的基础知识
1.1 Paginator
和Page
类
Django中提供了Paginator
类和Page
类来实现分页功能。其中Paginator
类负责分页部分逻辑,Page
类则用于获取分页后的结果。
Paginator
类有两个常用方法:
- Paginator.count
属性:获取总数据条数;
- Paginator.num_pages
属性:获取总页数。
Page
类有三个常用方法:
- Page.object_list
属性:获取当前页码的对象列表;
- Page.number
属性:获取当前页码;
- Page.has_previous()
方法:判断是否有上一页;
- Page.has_next()
方法:判断是否有下一页;
1.2 定义视图函数
为了实现分页功能,需要定义一个视图函数。
示例1:基于类视图 ListView
的分页实现方式
from django.core.paginator import Paginator
from django.views.generic import ListView
from myapp.models import MyModel
class MyListView(ListView):
template_name = 'my_template.html'
context_object_name = 'my_list'
paginate_by = 10
def get_queryset(self):
return MyModel.objects.all()
通过上述代码我们定义了一个名为MyListView
的类,继承了Django内置的ListView
类。
其中,template_name
属性表示定义渲染的模板文件名,context_object_name
属性是用于将模型的查询结果传到模板中并进行渲染。paginate_by
属性表示定义每一页的数据条数,这里我们设置为10条。
get_queryset()
方法返回查询结果集。
示例2:基于普通视图函数的分页实现方式
from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import MyModel
def my_view(request):
my_list = MyModel.objects.all()
paginator = Paginator(my_list, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'my_template.html', {'page_obj': page_obj})
通过上述代码我们定义一个名为my_view
的函数,实现了分页的逻辑。
首先,我们查询所有的MyModel
模型,然后实例化Paginator
类,并将查询结果和每页显示数据条数传入;接着,从请求的查询字符串中获取当前页码,并调用Paginator
实例的get_page()
方法获取对应页码的分页结果集。
2. Django中实现分页方法的示例代码分析
现在,我们通过两个实例来具体学习Django的分页实现方式。
2.1 示例1:基于类视图 ListView
的分页实现方式
这里,我们使用了一个模型MyModel
作为数据来源来展示分页结果。
2.1.1 创建模型
为此,我们创建一个名为MyModel
的模型,代码如下:
from django.db import models
class MyModel(models.Model):
name = models.CharField(max_length=200)
age = models.IntegerField()
2.1.2 创建数据
通过管理后台新建一些测试数据。
2.1.3 实现类视图
在应用的views.py文件中添加以下代码:
from django.core.paginator import Paginator
from django.views.generic import ListView
from myapp.models import MyModel
class MyListView(ListView):
template_name = 'my_template.html'
context_object_name = 'my_list'
paginate_by = 10
def get_queryset(self):
return MyModel.objects.all()
至此,分页实现已完成。接着,我们来编写模板文件my_template.html
。
2.1.4 编写模板文件
在应用的templates目录下新建模板文件my_template.html
,代码如下:
{% extends "base.html" %}
{% block content %}
<ul>
{% for obj in page_obj %}
<li>{{ obj.name }} - {{ obj.age }}</li>
{% empty %}
<li>No Data</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endblock %}
然后,我们可以在浏览器中访问http://127.0.0.1:8000/my_list
来查看分页结果。
2.2 示例2:基于普通视图函数的分页实现方式
同样以MyModel
作为数据来源,我们来编写第二个实例。
2.2.1 实现视图函数
在应用的views.py文件中添加以下代码:
from django.core.paginator import Paginator
from django.shortcuts import render
from myapp.models import MyModel
def my_view(request):
my_list = MyModel.objects.all()
paginator = Paginator(my_list, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return render(request, 'my_template.html', {'page_obj': page_obj})
2.2.2 编写模板文件
在应用的templates目录下新建模板文件my_template.html
,代码如下:
{% extends "base.html" %}
{% block content %}
<ul>
{% for obj in page_obj %}
<li>{{ obj.name }} - {{ obj.age }}</li>
{% empty %}
<li>No Data</li>
{% endfor %}
</ul>
<div class="pagination">
<span class="step-links">
{% if page_obj.has_previous %}
<a href="?page=1">« first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current-page">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last »</a>
{% endif %}
</span>
</div>
{% endblock %}
接着,我们运行服务器并在浏览器中访问http://127.0.0.1:8000/my_view
来查看分页结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django实现分页的方法 - Python技术站