修改Django分页类,自定义实现分页功能

虽然Django自带的有分页类Paginator,但是不能自定义的显示诸如123 4 567这样的分页方式,因此自定义自己的Paginator类来实现分页功能。

分页分析:

分页情况,包含了以下4种情况。

  • 第一种是当你要显示的最大页数,大于你实际拥有的页数的时候
  • 第二种是当前页数小于一共要显示多少页的一半的时候
  • 第三种是当前页加共显示多少页的一半,大于实际的总页数的时候
  • 第四种是当前页大于共显示多少页的一半的时候

代码实现:

新建一个名为mypaginator.py的文件,代码为如下部分:

# -*- coding: utf-8 -*-
from django.core.paginator import Paginator


class MyPaginator(Paginator):
    def __init__(self, current_page, max_pager_num, *args, **kwargs):
        self.current_page = int(current_page)
        self.max_pager_num = int(max_pager_num)
        super(MyPaginator, self).__init__(*args, **kwargs)

    def get_start_end(self):
        return self.show_page_num()

    def show_page_num(self):
        # 对应第一种情况
        if self.max_pager_num > self.num_pages:
            start = 1
            end = self.num_pages
            return start, end

        # 对应第二种情况
        part = self.max_pager_num // 2
        if self.current_page < part + 1:
            start = 1
            end = self.max_pager_num
            return start, end

        # 对应第三种情况
        if self.current_page + part > self.num_pages:
            start = self.num_pages - self.max_pager_num + 1
            end = self.num_pages
            return start, end

        # 对于第四种情况
        if self.current_page > part + 1:
            start = self.current_page - part
            end = self.current_page + (part - 1)
            return start, end

说明:
__init__中多定义了两个参数。current_page是当前页数,可以用来进行页码的跳转以及点击其他页数。max_pager_num-1是一共要显示多少页。start,end是页面要显示的起始页,和最终页。

在view.py里,代码如下:

def index(request):
    posts = Post.objects.all().order_by('created_date')
    current_page = request.GET.get('page', 1)
    paginator = MyPaginator(current_page, 11, posts, 1)
    start, end = paginator.get_start_end()
    page_range = range(start, end + 1)
    try:
        post_list = paginator.page(current_page)
    except PageNotAnInteger:
        post_list = paginator.page(1)
    except EmptyPage:
        post_list = paginator.page(paginator.num_pages)
    return render(request, 'index.html',
                  {"post_list": post_list,"page_range": page_range})

在页面当中,可以这样使用:

{% if post_list.has_previous %}
    <a href="?page={{ post_list.previous_page_number }}">上一页</a>
{% endif %}

{% for i in page_range %}
    {% if post_list.paginator.current_page == i %}
        <a style="color: red"
           href="?page={{ i }}">{{ i }}</a>
    {% else %}
        <a href="?page={{ i }}">{{ i }}</a>
    {% endif %}
{% endfor %}

{% if post_list.has_next %}
    <a href="?page={{ post_list.next_page_number }}">下一页</a>
{% endif %}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值