from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
1. 示例
1.1. 视图函数
# views.py
def news(request):
articles_all = Article.objects.all()
# 页码
paginator = Paginator(articles_all, 6) # 每页6个
page = request.GET.get('page') # 获取page
try:
articles = paginator.page(page)
except PageNotAnInteger:
articles = paginator.page(1)
except EmptyPage:
articles = paginator.page(paginator.num_pages)
return render(request, 'list.html', {
'articles': articles,
})
1.2. 模板中
<!-- list.html -->
<div class="pages">
{% if articles.has_previous %}
<a href="?page={{ articles.previous_page_number }}">上一页</a>
{% endif %}
{% for page in articles.paginator.page_range %}
{% if articles.number == page %}
<a href="#" class="now">{{ page }}</a>
{% else %}
<a href="?page={{ page }}">{{ page }}</a>
{% endif %}
{% endfor %}
{% if articles.has_next %}
<a href="?page={{ articles.next_page_number }}">下一页</a>
{% endif %}
</div>
如果有GET参数传输,则可以把传入后台的GET参数用 urlencode()
重新组合,然后传回页面加载链接后面,比如“下一页”的链接可以是:
<a href="?page={{ articles.next_page_number }}&{{ urlencode_str }}">下一页</a>
2. 基本语法
以下面的 objects_all
为例:
2.1. paginator
objects_all = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10']
paginator = Paginator(objects_all, 3) # 每3个分1页
属性/方法 | 结果 | 备注 |
---|---|---|
paginator.count | 10 | 总个数 |
paginator.num_pages | 4 | 总共分页数 |
paginator.page_range | xrange(1,5) | 页码范围 |
paginator.page(2) | objects | 生成页面内信息 |
2.2. objects
objects_all = ['item1', 'item2', 'item3', 'item4', 'item5', 'item6', 'item7', 'item8', 'item9', 'item10']
paginator = Paginator(objects_all, 3) # 每3个分1页
objects = paginator.page(2) # 模拟第2页
属性/方法 | 结果 | 备注 |
---|---|---|
objects.object_list | [‘item4’,’item5’,’item6’] | 第一页元素列表 |
objects.number | 2 | 当前分页值 |
objects.has_previous() | True | 是否有前一页 |
objects.has_next() | True | 是否有下一页 |
objects.previous_page_number() | 1 | 前一页页码 |
objects.next_page_number() | 3 | 后一页页码 |
objects.start_index() | 4 | 第二页开始元素索引 |
objects.end_index() | 6 | 第二页结束元素索引 |