写一个blog的时候用到了分页,纪录起来。
from django.core.paginator import Paginator
就是用到这个Paginator类
Paginator(object_list, per_page, [orphans=0, allow_empty_first_page=True])
参数object_list (数据总量)和 per_page(每页的数据量)为必填参数
orphans(最后一页对象的最少数目,默认为0) 如果想避免最后一页显示太少。则可以使用这个值。 那么最后一页的数据,自动被前移一页。比如总共23个数据。每页显示 10.orphans=3 那么,第一页为10,第二页为13.
allow_empty_first_page(表示首页是否可以为空)如果是 False 而且``object_list`` 为空,那么会触发 EmptyPage 异常。
简单用法
view层引用:
from django.core.paginator import Paginator
def index(request):
home_display_columns = Category.objects.filter(home_display=True)
nav_display_columns = Category.objects.filter(nav_display=True)
index_article = Article.objects.filter(published=1).order_by('-pub_date')
limit = 2
paginator = Paginator(index_article, limit) #每页两条数据
page = request.GET.get('page', 1) #QueryDict objects,如果没有对应的page键,就返回默认1。
item_info = paginator.page(page) #根据索引page,返回该page数据,如果不存在,引起 InvalidPage异常
return render(request, 'index.html', {
'home_display_columns': home_display_columns,
'nav_display_columns': nav_display_columns,
'index_article': index_article,
'item_info': item_info,
})
再看模版层, 用的semantic ui
template:
<div class="ui pagination center aligned menu">
{% if item_info.has_previous %}
<a class="item" href="?page={{item_info.previous_page_number}}">上一页</a>
{% endif %}
{% for page_num in item_info.paginator.page_range %}
<a class="item" href="?page={{page_num}}">
{{page_num}}
</a>
{% endfor %}
{% if item_info.has_next %}
<a class="item" href="?page={{item_info.next_page_number}}">下一页</a>
{% endif %}
</div>
{% endblock content %}
一个基本的分页模块就完成了。