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 %}

 

posted @ 2017-12-03 16:55  予沫笙  阅读(1260)  评论(0编辑  收藏  举报