django_自带分页_自定制

Posted yuanlaishixiaosa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django_自带分页_自定制相关的知识,希望对你有一定的参考价值。


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

注明函数中的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 %}


作者:毅个测试
链接:https://www.jianshu.com/p/87e6d1392f54
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
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 %}
 



作者:毅个测试
链接:https://www.jianshu.com/p/87e6d1392f54
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

















以上是关于django_自带分页_自定制的主要内容,如果未能解决你的问题,请参考以下文章

django自定义分页器

Django自定义分页器

django——自定义分页

django——自定义分页

Django_静态文件/中间件/分页

django学习2分页