在路上~
每当用到表格展现数据时,都回遇到表格数据量过大而展示不佳的情况,这时候,分页工具Paginator从天而降(也废了工程师们些力气)。
一、分页工具Paginator的引入
from django.core.paginator import PageNotAnInteger, Paginator, InvalidPage, EmptyPage
二、如何分页
from django.core.paginator import PageNotAnInteger, Paginator, InvalidPage, EmptyPage
def list(request):
books = Book.objects.all() #之前需要从models中导入Book
after_range_num = 5 #当前页前显示5页
befor_range_num = 4 #当前页后显示4页
try: #如果请求的页码少于1或者类型错误,则跳转到第1页
page = int(request.GET.get("page",1))
if page < 1:
page = 1
except ValueError:
page = 1
paginator = Paginator(books,2) # 设置books在每页显示的数量,这里为2
try: #跳转到请求页面,如果该页不存在或者超过则跳转到尾页
books_list = paginator.page(page)
except(EmptyPage,InvalidPage,PageNotAnInteger):
books_list = paginator.page(paginator.num_pages)
if page >= after_range_num:
page_range = paginator.page_range[page-after_range_num:page+befor_range_num]
else:
page_range = paginator.page_range[0:int(page)+befor_range_num]
return render-to_response('book_list.html',{'books':books_list,'page_range':page_range})
三、返回给前端如何展示(即template视图)
{% for book in books.object_list %}
{{ book.id }} | {{ book.name }} <br />
{% endfor %}
<div>
{% if books.has_previous %}
<a href="?page={{ books.previous_page_number }}">< 上一页</a>
{% endif %}
<span>
{% for p in page_range %}
{% ifequal p books.number %}
<span class="current">{{p}}</span>
{% else %}
<a href="?page={{p}}" title="第{{p}}页">{{p}}</a>
{% endifequal %}
{% endfor %}
</span>
{% if books.has_next %}
<a href="?page={{ books.next_page_number }}">下一页 > </a>
{% endif %}
<a >[第{{ books.number }}/{{ books.paginator.num_pages }}页]</a>
</div>
四、各种相关熟悉以及相关方法
1. 各种相关的属性:
总页数:paginator.num_pages
总记录数: paginator.count
页的范围: paginator.page_range, 比如 [1, 2, 3, 4]
页数据(list): page.object_list
当前页码: page.number、
2. 相关的方法:
是否有下页:page.has_next(), True/False
是否有上页:page.has_previous()
下一页的页码:page.next_page_number()
上一页的页码:page.previous_page_number()
当前页第一个对象: page.start_index()
当前页最后一个对象: page.end_index()