美文网首页
django_自带分页_自定制

django_自带分页_自定制

作者: 两点半的杂货铺 | 来源:发表于2018-02-24 11:31 被阅读191次

    一、自带分页,一些常用参数

    注明函数中的paginator.page(current_page)更多的使用在html页面,current_page用来接收前端返回的页数值

    • import 引入
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    • 负责后台处理的Paginator函数

    paginator = Paginator(USER_LIST,10)两个参数分别接收,数据库中的总条数,和每页显示多少条,其他的返回函数分别有:

    # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象(是否具有上一页,下一页)
    
    • 用来处理前端的page,也是Paginator返回函数

    用来判断是否具有上一页,下一页,因此接收的是,页面返回的页数
    posts = paginator.page(current_page),页数有不确定性所以用异常处理做处理,常见的返回函数

            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
    
    • 代码案例
    def index1(request):
        from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
        current_page = request.GET.get('page')
        paginator = Paginator(USER_LIST,10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象(是否具有上一页,下一页)
        try:
            posts = paginator.page(current_page)
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
        except PageNotAnInteger:
            posts = paginator.page(1)
    
        return render(request,'index1.html',{'posts':posts})
    
    • 在前端处理的时候

    可以在templates,目录下创建include文件夹,里面放置写好的分页前端的代码块,用{% include 'incldue/pager.html' %}调用部分代码

    //是否有上一页
    {% if posts.has_previous %}
        <a href="/index1?page={{ posts.previous_page_number }}">上一页</a>
    //没有上一页,不让点击
    {% else %}
        <a href="#">上一页</a>
    {% endif %}
    //是否有下一页
    {% if posts.has_next%}
        <a href="/index1?page={{ posts.next_page_number }}">下一页</a>
    //没有下一页,不让点击
    {% else %}
        <a href="#">下一页</a>
    {% endif %}
    

    数据展示用的是has_previous函数

    <ul>
    {% for i in posts %}
        <li>{{ i }}</li>
    {% endfor %}
    
    </ul>
    

    二、自定制

    python 自带的分页,由于妻子输入你的功能缺陷,我们可以对其自定制,让页面展示底栏的页数,还可以进行跳转设置

    • 原理

    想要在html页面改变效果,就要对Paginator.page进行处理,为了避免在源码直接处理的尴尬,选着继承的方式,整体的思路如下:

    #保证循环的次数在规定的展示栏个数,如果设置11,循环的次数保证在11次
    class CustomPaginator(Paginator):
        def __init__(self,  current_page, per_pager_num,*args, **kwargs):
            '''
            :param current_page:  当前页
            :param per_pager_num: 底边栏展示页数
            '''
            self.current_page = int(current_page)
            self.per_pager_num = int(per_pager_num)
            super(CustomPaginator, self).__init__(*args, **kwargs)
    
        def page_num_range(self):
      #总页数小于实际展示页
            if self.num_pages < self.per_pager_num:
                return range(1,self.num_pages+1)
    
            #part 当前总展示栏中间点5
            part = int(self.per_pager_num//2)
    
            #最小页数为1防止出现负数情况
            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)
    
    
    
    

    跟上面的变动的位置


    image.png

    以后自定制是要调用我们写的函数
    paginator = CustomPaginator(11,current_page,USER_LIST,10)
    其中11是底栏最多展示条数 ,'current_page'当前页

    • 前端显示
     {% for i in posts.paginator.page_num_range%}
            {% if i == posts.number  %}
                <a style="font-size: 30px" href="index1/?page={{ i }}">{{ i }}</a>
            {% else %}
                <a  href="/index1/?page={{ i }}">{{ i }}</a>
            {% endif %}
        {% endfor %}
    

    相关文章

      网友评论

          本文标题:django_自带分页_自定制

          本文链接:https://www.haomeiwen.com/subject/dbrfxftx.html