在 django 中使用 Paginator 可以很方便的实现分页功能,下面就通过一个具体的例子来讲讲如何使用 Paginator。
在 view 中使用 Paginator
from django.core.paginator import Paginator
from django.core.paginator import EmptyPage
from django.core.paginator import PageNotAnInteger
from hello.models import Topic
def index(request):
limit = 3 # 每页显示的记录数
topics = Topic.objects.all()
paginator = Paginator(topics, limit) # 实例化一个分页对象
page = request.GET.get('page') # 获取页码
try:
topics = paginator.page(page) # 获取某页对应的记录
except PageNotAnInteger: # 如果页码不是个整数
topics = paginator.page(1) # 取第一页的记录
except EmptyPage: # 如果页码太大,没有相应的记录
topics = paginator.page(paginator.num_pages) # 取最后一页的记录
return render_to_response('index.html', {'topics': topics})
模板中的相关操作
{% for topic in topics.object_list %}
<p>{{ topic.title }}</p>
{% endfor %}
<!-- 第一种分页显示方式 -->
<p>
{# topics.paginator.page_range 这个函数返回包含一个所有页码数的 range 对象 #}
{# 即 range(1, topics.paginator.num_pages + 1) #}
{% for page_number in topics.paginator.page_range %}
{% ifequal page_number topics.number %}
{{ page_number }}
{% else %}
<a href="?page={{ page_number }}">{{ page_number }}</a>
{% endifequal %}
{% endfor %}
</p>
<!-- 另一种分页显示方式 -->
<p>
{% if topics.has_previous %}
<a href="?page={{ topics.previous_page_number }}">Previous</a>
{% endif %}
{# topics.paginator.number_pages 返回总页数 #}
Page {{ topics.number }} of {{ topics.paginator.num_pages }}.
{% if topics.has_next %}
<a href="?page={{ topics.next_page_number }}">Next</a>
{% endif %}
</p>
效果:
基于 django 1.4.3 的示例项目:仓库 && 下载 。
Comments