Django分页解析
分页
django中实现管理数据分页的类位于 django.core.paginator.py中
Paginator类
对列表数据进行分页处理
对象
Paginator(Post.objects.all(),3)
Paginator(列表,int) 返回分页对象,专门处理分页(list集合,每页的数量)
属性
count num_pages page_range
paginator.count 所有页面的对象总数
paginator.num_pages 页面总数
paginator.page_range 页码列表
方法
page(num):下标以1开始的下标对象,如果提供的页码不存在,抛出InvalidPage异常
异常exception
InvalidPage:当向page()传入一个无效的页码时抛出
PageNotAnInteger:当向page()传入一个不是整数的值时抛出
EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
Page对象
Paginator 对象的page() 方法返回Page对象
page = pageinator(1) 返回指定页
属性
page . object_list 获得当前页所有的数据+=对象的列表
Page . number 当前页的序号,从1 开始
Page. paginator 当前页page相关的Paginator对象
方法
has_next():如果有下一页返回True
has_previous():如果有上一页返回True
has_other_pages():如果有上一页或下一页返回True
next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常
previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常
Page.start_index()[source]返回当前页上的第一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的start_index()会返回3。
Page.end_index()[source]返回当前页上的最后一个对象,相对于分页列表的所有对象的序号,从1开始。 比如,将五个对象的列表分为每页两个对象,第二页的end_index() 会返回 4。
len():返回当前页面对象的个数
迭代页面对象:访问当前页面中的每个对象
案例
method 最多显示5 页
@staticmethod def get_posts_by_page(num,per_page=1): num = int(num) pagintor = Paginator(Post.objects.order_by('-modified').all(),per_page) if num <1: num =1 if num > pagintor.num_pages: num =pagintor.num_pages page = pagintor.page(num) # 最多显示5页 # range =[ ) pervious= 2 last = 2 #如果当前页为 1 或2 时范围 if num <=pervious: start = 1 end = pervious+last+1 # 如果当前页大于2 范围 #例如当前页 为 8 时 start=6 end = 10 if num > pervious: start = num- pervious end = num+last #当最后一样超过总页数时 # 例如当前页 为 8 时 start=6 end = 10 但是 只有9页 if end > pagintor.num_pages: min = end - pagintor.num_pages end = pagintor.num_pages start -= min return (page,range(start,end+1))
页面渲染
def index_view(request,num = '1'): page,page_range=Post.get_posts_by_page(num) return render(request,'index.html',context={'page':page,'page_range':page_range})
html中页面显示
{% if page.has_previous %} <a class="extend prev" rel="next" href="/page/{{ page.previous_page_number }}">« Prev</a> {% endif %} {% for p in page_range %} {% if p == page.number %} <span class="page-number current">{{ p }}</span> {% else %} <a class="page-number" href="/page/{{ p }}">{{ p }}</a> {% endif %} {% endfor %} {% if page.has_next %} <a class="extend next" rel="next" href="/page/{{ page.next_page_number }}">Next »</a> {% endif %}