django 分页
-
概念:
Django提供了paginator类可以方便的实现分页功能。实际上是使用Paginator对象,负责分页数据整体的管理。-
对象的构造方法:
paginator = Paginator(object_list,per_page),object_list是需要分页的数据的对象列表,per_page是每页数据的个数。
Paginator属性:count:需要分页的数据的对象总数 num_pages: 分页后的页面总数 page_range: 从1开始的range对象,用于记录当前码数 per_page:每页数据的个数
paginator对象.page(number): 参数number是页码信息(从1开始),返回当前number页对应的页信息,如果提供的页码不存在,则抛出InvalidPage异常。
-
针对到具体某一页的时候,用到的是page对象:page对象负责具体某一页的数据的管理。
创建对象:Paginator对象的page()方法返回Page对象,page = paginator.page(页码)
Page对象属性:object_list: 当前页上所有数据对象的列表 number: 当前页的序号,从1开始 paginator: 当前page对象相关的Paginator对象
page对象方法:
has_next():如果有下一页返回True; has_previous():如果有上一页则返回True has_other_pages():如果有上一页或者下一页就返回True next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常 previous_page_number(): 返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
-
-
实现:
-
路由:path(‘test_page’,views.test_page),
-
模板:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test_page</title> </head> <body> {% for p in current_page %} <p> {{ p }} </p> {% endfor %} {% if current_page.has_previous %} <a href="/test_page?page={{ current_page.previous_page_number }}">上一页</a> {% else %} 上一页 {% endif %} {#当前页显示页码,非当前页显示a标签#} {% for page_num in paginator.page_range %} {% if page_num == current_page.number %} {{ page_num }} {% else %} <a href="/test_page?page={{ page_num }}">{{ page_num }}</a> {% endif %} {% endfor %} {% if current_page.has_next %} <a href="/test_page?page={{ current_page.next_page_number }}">下一页</a> {% else %} 下一页 {% endif %} </body> </html>
-
视图函数:
def test_page(request): #/test_page/4 #/test_page?page=4 #拿到当前的页码,没有的话就默认是1 page_num = request.GET.get('page',1) all_data = ['a','b','c','d','e','f','g','h','i'] #初始化paginator #第一个参数是总的数据,第二个参数是每页显示的条数 paginator = Paginator(all_data,2) #初始化具体页码对应的page对象,管具体的每一页 current_page = paginator.page(int(page_num)) return render(request,'test_page.html',locals()) #视图函数捋一捋,准备好数据,初始化好paginator,根据页码初始化好page对象
-