django paginator 流行分页模式

2019/7/27 posted in  python

以下是当前比较流行的分页器写法,使用简单的paginator自带的分页是达不到这个效果的,我们需要自己更新我们的分页模型。

  1. 如果当前页为1, 则不显示上一页
  2. 如果当前页不为1

参看网站

具体实现

首先定义自己的分页器,扩展系统分页器。在app中创建custom_paginator.py文件

from django.core.paginator import Paginator


class CustomPaginator(Paginator):
    def __init__(self, current_page, per_pager_num, *args, **kwargs):
        # 当前页
        self.current_page = int(current_page)
        # 页码最大显示范围
        self.per_pager_num = per_pager_num
        # 继承父类Paginator的其他属性方法
        Paginator.__init__(self, *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)
        else:
            return range(self.current_page - part, self.current_page + part + 1)

    def show_first_page(self):
        part = int(self.per_pager_num / 2)
        if self.current_page > part + 1:
            return True
        else:
            return False

    def show_last_page(self):
        part = int(self.per_pager_num / 2)
        if self.current_page < self.num_pages - part:
            return True
        else:
            return False

在view.py中添加相应的分页内容

def catalog_view(request):
    dribbbles_all = Dribbble.objects.filter(detail_flag=1).filter(download_flag=1)
    current_page = request.GET.get('page', 1)

    paginator = CustomPaginator(current_page, 5, dribbbles_all, 16)

    try:
        # 取对象的当前页分页对象
        posts = paginator.page(current_page)
        # current_page非数字时取第一页
    except PageNotAnInteger:
        posts = paginator.page(1)
        # current_page空时取最后一页
    except EmptyPage:
        posts = paginator.page(paginator.num_pages)

    context = {
        'dribbbles': posts,
    }
    return render(request, 'collect/catalog.html', context)

页面模板分页器内容

<!-- Pagination -->
          <div class="pagination clearfix">
            <nav class="pagination__nav right clearfix">
              {% if dribbbles.has_previous %}
                <a href="?page={{ dribbbles.previous_page_number }}" class="pagination__page"><i
                  class="ui-arrow-left"></i></a>
              {% endif %}

              {% if dribbbles.paginator.show_first_page %}
                <a href="?page=1" class="pagination__page">1</a>
                <span>...</span>
              {% endif %}


              {% for p in dribbbles.paginator.pager_num_range %}
                <!--如果是当前页,高亮显示-->
                {% if p == dribbbles.number %}
                  <a href="#" class="pagination__page pagination__page--current">{{ p }}</a>
                {% else %}
                  <a href="?page={{ p }}" class="pagination__page">{{ p }}</a>
                {% endif %}
              {% endfor %}

              {% if dribbbles.paginator.show_last_page %}
                <span>...</span>
                <a href="?page={{ dribbbles.paginator.num_pages }}" class="pagination__page">{{ dribbbles.paginator.num_pages }}</a>

              {% endif %}

              {% if dribbbles.has_next %}
                <a href="?page={{ dribbbles.next_page_number }}" class="pagination__page"><i
                  class="ui-arrow-right"></i></a>
              {% endif %}
            </nav>
          </div>