Django自身已经集成了一个分页器,不要我们重新造轮子,直接使用就行。
在MVC设计模式中,views.py作为controller,templates作为view。应用Django分页Paginator需要在这两处地方修改。
view中:取得queryset后,增加分页器过滤,然后将数据传递给模板。
def index(request):
post_list = Post.objects.all()
data = {}
pages, post_list = getPages(request,post_list)
data['post_list'] = post_list
data['pages'] = pages
return render(request, 'blog/index.html', data )其中getPages为分页器过滤,独立作为一个文件paginator.py,在view中引用。
from django.core.paginator import Paginator,EmptyPage, PageNotAnInteger
def getPages(request, objectlist):
"""get the paginator"""
currentPage = request.GET.get('page', 1)
paginator = Paginator(objectlist, 10)
try:
objectlist = paginator.page(currentPage)
except PageNotAnInteger:
# If page is not an integer, deliver first page.
objectlist = paginator.page(1)
except EmptyPage:
# If page is out of range (e.g. 9999), deliver last page of results.
objectlist = paginator.page(paginator.num_pages)
objectlist = paginator.page(currentPage)
return paginator, objectlist如此,得到分页器过滤后的数据后,在模板中通过模板标签使用。
在index.html模板文件中,增加block,方便当页数小于2时,控制显示。
{% block paginations %}
{% if pages.num_pages > 1 %}
<div>
<span class="blog_footer_tip">
共{{ pages.count }}篇博文。当前第{{ post_list.number }}页,共{{ pages.num_pages }}页
</span>
<ul class="pagination">
{# 上一页,这里需要用到has_previous方法判断是否有上一页 #}
<li>
{% if post_list.has_previous %}
<a href="?page={{ post_list.previous_page_number }}" aria-label="Previous">
{% else %}
<a href="?page={{ post_list.number }} " aria-label="Previous">
{% endif %}
<span aria-hidden="true">«</span>
</a>
</li>
{# 遍历所有页码 #}
{% for page in pages.page_range %}
<li><a href="?page={{ page }}">{{ page }}</a></li>
{% endfor %}
{# 下一页,这里需要用到has_next方法判断是否有下一页 #}
<li>
{% if post_list.has_next %}
<a href="?page={{ post_list.next_page_number }}" aria-label="Next">
{% else %}
<a href="?page={{ post_list.number}}" aria-label="Next">
{% endif %}
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</div>
{% block extra_footer %}
{#设置凸显当前的页码#}
<script type="text/javascript">
$(".pagination li:eq({{ post_list.number}})").addClass("active");
</script>
{% endblock %}
{% endif %}
{% endblock paginations %}说明几点:1.对象pages有num_pages,count,page_range等属性方法,经过分页器过滤的post_list有number,previous_page_number,next_page_number等。2.通过if模板标签,将block extra_footer在不需要的时候隐藏了。
您尚未登录,请先登录才能评论。