分页组件

分页组件

Django内置分页

Django为我们提供了一个paginator分页工具,示例如下:

views文件中

from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger

UESR_LIST=[]
for i in range(1,99):
    temp={'name':'root'+str(i),'age':i}
    UESR_LIST.append(temp)

def index1(request):

    current_page = request.GET.get('p') 
    current_page = int(current_page)
    paginator=paginator(UESR_LIST,10)#每页显示10条
    #count:所有页面的对象总数
    #num_pages:页面总数
    #page_rangeL基于1的页数范围迭代器

    try:
        # Page对象
        posts = paginator.page(current_page)
        #has_next                 是否有下一页
        #next_page_number         下一页页码
        #has_previous             是否有上一页
        #previous_page_number     上一页页码
        #object_list               分页之后的数据列表
        #number                   当前页
        #paginator                paginator对象
    except PageNotAnInteger:
        # 如果请求的页数不是整数,返回第一页
        posts=Paginator.page(1)
    except EmptyPage:
         # 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
        posts=paginator.page(paginator.num_pages)
    return render(request,'index1.html',{'posts':posts})

在index1模板中,实现要显示的的页数

    <ul>
        {% for row in posts %}
            <li>{{ row.name }}-{{ row.age  }}</li>
        {% endfor %}
    </ul>
    {% if posts.has_previous %}#如果有上一页就显示
        <a href="/index1.html?p={{ posts.previous_page_number }}">上一页</a>
    {% endif %}
    {% if posts.has_next %}#如果有下一页就显示
        <a href="/index1.html?p={{ posts.next_page_number }}">下一页</a>
    {% endif %}

    <span>{{ posts.number }}/{{ posts.paginator.num_pages }}
    </span>

扩展Django的内置分页

扩展paginator分页工具,实现页数显示的优化

views.py
#定义一个新类,继承原来的Paginator对象
class CustomPaginator(Paginator):
    def __init__(self,current_page,per_pager_num,*args,**kwargs):
        self.current_page=int(current_page)
        self.per_pager_num=int(per_pager_num)
        super(CustomPaginator,self).__init__(*args,**kwargs)
    def pager_num_range(self):
        if self.num_pages<self.per_pager_num:
            #页面总数少于每页分页数,则只应该显示到页面总数
            return range(1,self.num_pages+1)
        part=int(self.per_pager_num/2)
        #使当前页的页码所处位置为中间
        if self.current_page<=part:
            return range(1,self.per_pager_num+1)
        if(self.current_page+part)>self.num_pages:
            return range(self.num_pages-self.per_pager_num+1,self.num_pages+1)
        return range(self.current_page-part,self.current_page+part+1)
    
    #在index1函数中,只需将语句paginator=paginator(UESR_LIST,10)换成
    paginator=CustomPaginator(current_page,7,UESR_LIST,10)即可

在index1模板中,在上一页下一页中间加入页数模板

{% for i in posts.paginator.pager_num_range %}
        {% if i == posts.number %}
            <a style="font-size: 30px" href="/index1.html?p={{ i }}">{{ i }}</a>
        {% else %}
            <a href="/index1.html?p={{ i }}">{{ i }}</a>
        {% endif %}
    {% endfor %}

自定义分页

由于框架之间并不是所有的内置函数实现的功能都一样,如果我们可以自制分页,那么就可以再不同的框架之间使用,从而满足我们的需求

新建一个py文件,定义一个新的类

class Pagination(object):
    def __init__(self,totalCount,currentPage,perPageNum=30,maxPageNum=7):
        #总共的数目
        self.total_count=totalCount
        try:
            #当前页数
            self.current_page=int(currentPage)
        except:
            self.current_page=1

        #每一页显示的数目
        self.per_page_num=perPageNum
        #显示的页码数
        self.max_page_num=maxPageNum

    def start(self):
        return (self.current_page-1)*self.per_page_num

    def end(self):
        return self.current_page*self.per_page_num

    @property
    def num_pages(self):
        '''
        总页数
        '''
        a,b=divmod(self.total_count,self.per_page_num)#a为商,b为余数
        if b==0:
            return a
        return a+1

    def pager_num_range(self):
        if self.num_pages<self.per_page_num:
            #页面总数少于每页分页数,则只应该显示到页面总数
            return range(1,self.num_pages+1)
        part=int(self.max_page_num/2)
        #使当前页的页码所处位置为中间
        if self.current_page<=part:
            return range(1,self.max_page_num+1)
        if(self.current_page+part)>self.num_pages:
            return range(self.num_pages-self.max_page_num+1,self.num_pages+1)
        return range(self.current_page-part,self.current_page+part+1)


在view文件中,导入新建的类

def index2(request):
    from app01.pager import Pagination
    current_range=request.GET.get('p')
    page_obj=Pagination(666,current_range)
    data_List=UESR_LIST[page_obj.start():page_obj.end()]
    return render(request,'index2.html',{'data':data_List,'page_obj':page_obj})

渲染

    <ul>
        {% for row in data %}
            <li>{{ row.name  }}-{{ row.age }}</li>
        {% endfor %}
    </ul>
    {% for i in page_obj.pager_num_range %}
        <a href="/index2.html?p={{ i }}">{{ i }}</a>
    {% endfor %}
posted @ 2019-05-07 23:07  Dandelion-L  阅读(84)  评论(0)    收藏  举报