django 分页

Django自带分页:

 导入:    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

含有两个对象可以互相调用:page对象  paginator 对象

对象方法不相同  

paginator 对象方法:

                par_page:           每页显示条目数量
                cout:                  数据总个数
                num_pages:      总页数
                page_range:   总页数的索引范围(1,100)

                page:              page对象

page对象方法:

         has_next                   是否有下一页
         next_page_number  下一页页码
         has_previous            是否有上一页
         object_list                 分页之后的数据列表
         number                    当number前页
         paginator                 paginator对象


自定显示页码


————————————————————————————————————————————————————


class CustomPaginator(Paginator):
    def __init__(self,current_page, per_pager_num,*args,**kwargs):
        # 当前页
        self.current_page = int(current_page)
        # 最多显示的页码数量 11
        self.per_pager_num = int(per_pager_num)
        super(CustomPaginator,self).__init__(*args,**kwargs)
    def pager_num_range(self):
        # 当前页
        #self.current_page
        # 最多显示的页码数量 11
        #self.per_pager_num
        # 总页数
        # self.num_pages
        if self.num_pages < self.per_pager_num:
            return range(1,self.num_pages+1)
        # 总页数特别多 5
        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)

def index1(request):
    current_page = request.GET.get('p')
    # Paginator对象
    paginator = CustomPaginator(current_page,7,USER_LIST, 10)
    try:
        posts = paginator.page(current_page)
    except PageNotAnInteger:
        posts = paginator.page(1)
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    return render(request,'index1.html',{'posts':posts})

原版分页parger.html
 
{% if posts.has_previous %}
    <a href="index1?p={{ posts.previous_page_number }}">上一页</a>
{% endif  %}
{% if posts.has_next %}
<a href="index1?p={{ posts.next_page_number}}">下一页</a>
{% endif %}

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

<span> {{ posts.number }}</span>
<span>/ {{ posts.paginator.num_pages }}</span>
HTML文件

{% for row in posts%}
    <li>
        {{ row.name }}
        {{ row.age }}
    </li>
{% endfor %}
</ul>

{% include 'include/parger.html' %}


自定制分页显示

pager.py
# -*- coding:utf-8 -*-

class Pagination(object):
    def __init__(self, totalCount, currentPage,perPageItemNum=10, maxPageNum=7):
        # 数据总个数
        self.total_count = totalCount
        # 当前页
        try:
            v = int(currentPage)
            if v <= 0:
                v = 1
            self.current_page = v
        except Exception as e:
            self.current_page = 1

        # 每页显示的行数
        self.per_page_item = perPageItemNum
        # 每页最多显示页码数
        self.max_page_num = maxPageNum

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

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

    @property
    def num_pages(self):
        # 判断极值
        # 总页数199 每页显示
        a,b = divmod(self.total_count,self.per_page_item)
        if b == 0:
            return a
        return a+1

    # 要显示的页码
    def pager_num_range(self):
        # 当前页
        # self.current_page
        # 最多显示的页码数量 11
        # self.per_pager_num
        # 总页数
        # self.num_pages
        if self.num_pages < self.max_page_num:
            return range(1, self.num_pages + 1)
        # 总页数特别多 5
        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)

    # 返回前端页面的字符串
    def page_str(self):
        page_list = []

        first="<li><a href='/index2.html?p=1'>首页</a></li>"
        page_list.append(first)

        if self.current_page == 1:
            prev = "<li><a href='#'>上一页</a></li>"
        else:
            prev = "<li><a href='/index2.html?p=%s'>上一页</a></li>" % (self.current_page - 1,)
        page_list.append(prev)

        for i in self.pager_num_range():
            if i == self.current_page:
                temp = "<li class='active'><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
            else:
                temp = "<li><a href='/index2.html?p=%s'>%s</a></li>" % (i, i)
            page_list.append(temp)

        if self.current_page == self.num_pages:
            nex = "<li><a href='#'>下一页</a></li>"
        else:
            nex = "<li><a href='/index2.html?p=%s'>下一页</a></li>" % (self.current_page + 1,)
            page_list.append(nex)

        last = "<li><a href='/index2.html?p=%s'>尾页</a></li>" % (self.num_pages,)
        page_list.append(last)

        return "".join(page_list)

views.py

def index2(request):
    # 导入自定义py文件
    from app01.pager import Pagination
    # 获取当前页
    current_page = request.GET.get('p')
    # 创建对象传入值 199总数
    page_obj = Pagination(199,current_page)
    # 切片传入值
    data_list = USER_LIST[page_obj.start():page_obj.end()]

    return render(request,'index2.html',{"data":data_list,'page_obj':page_obj})
html 文件
{% 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 %}
        <ul class="pagination pagination-sm">
                {{ page_obj.page_str|safe }}
        </ul>



  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值