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在不需要的时候隐藏了。
您尚未登录,请先登录才能评论。