from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
1. 示例
1.1. 视图函数
# views.pydef news(request):articles_all = Article.objects.all()# 页码paginator = Paginator(articles_all, 6) # 每页6个page = request.GET.get('page') # 获取pagetry: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 | 第二页结束元素索引 |
