对于Django提供的数据分页的技术,Paginator类用于对列进行一页n条数据的分页运算,也就是分多少页,Page类用于表示第m页的数据,也就是一页显示多少数据
Paginator类常用对象属性
num_pages | 返回分页后总页数 |
---|---|
page_range | 返回分页后页码的列表,返回值类型为列表 |
count | 返回对象总数 |
init(data,number) | 返回分页对象,data为列表数据,number为每页数据的条数 |
page(number) | 返回第number页的Page类实例对象 |
对于Page类,可通过调用Paginator对象的page()方法来返回Page对象
number | 返回当前是第几页,从1开始 |
---|---|
object_list | 返回当前页对象的列表 |
paginator | 当前页对应的Paginator |
previous_page_number | 返回前一页的页码 |
next_page_number | 返回下一页的页码 |
has_next | 如果有下一页则返回True |
has_previous | 如果有上一页则返回True |
len() | 返回当前页面对象的个数 |
视图函数:
先获取数据库图书表的所有满足过滤器条件的数据内容,在通过Page类和Paginator类的属性方法获得页数和每一页的数据,在渲染到页面上
def show_books(request,pageIdx):
# 查询出所有满足条件的数据
bookslist= BookInfo.objects.filter(is_delete=0)
# print(bookslist)
# 整理当前页码
paginator = Paginator(bookslist,3)
if pageIdx == "":
pageIdx = 1
pageIdx=int(pageIdx)
# print(pageIdx)
# 通过对象获得图书信息
pageObj=paginator.page(pageIdx)
# 页码列表
codelist=paginator.page_range
return render(request,"book/show_books.html",
{"pageIdx":pageIdx,
"pageObj":pageObj,
"codelist":codelist,
"total":paginator.count,
"totalPage":paginator.num_pages
})
配置路由: d*返回当前页数
url(r'^show_books/(\d*)', show_books),
html页面:
<table border="1" width="400px" >
<tr>
<th>编号</th>
<th>书名</th>
<th>总数页</th>
</tr>
{% for book in pageObj.object_list %}
<tr align="center">
<td>{{book.id}}</td>
<td>{{book.bname}}</td>
<td>{{book.bpage}}</td>
</tr>
{% endfor %}
<tr align="center">
<td colspan="3">
共{{total}}条数据
{% if pageObj.has_previous %}
<a href="/book/show_books/{{pageObj.previous_page_number}}">上一页</a>
{% else %}
<span>上一页</span>
{% endif %}
{% for code in codelist %}
{% if pageIdx == code %}
<span>{{ code }}</span>
{% else %}
<a href="/book/show_books/{{ code }}">{{ code }}</a>
{% endif %}
{% endfor %}
{% if pageObj.has_next %}
<a href="/book/show_books/{{pageObj.next_page_number}}">下一页</a>
{% else %}
<span>下一页</span>
{% endif %}
共{{totalPage}}页
</td>
</tr>
</table>