python测试开发django-116.Paginator分页器页数大时显示省略号...


前言

使用django自带的Paginator分页器集合bootstrap的pagination控件可以实现分页功能,
如果页数较大的时候,希望能显示省略号+当前页,这样看起来更美观一点。

自定义分页功能

自定义一个分页功能,当分页导航栏数量很多时,多的页码显示省略号...,传3个参数

  • paginator Paginator分页器实例对象
  • page Page类实例对象,paginator.page(页码数)获取
  • is_paginated=True 是否需要显示分页导航栏
def pagination_function(paginator, page, is_paginated=True):
    if not is_paginated:
        # 如果没有分页,则无需显示分页导航条,不用任何分页导航条的数据,因此返回一个空的字典
        return {}

    # 当前页左边连续的页码号,初始值为空
    left = []

    # 当前页右边连续的页码号,初始值为空
    right = []

    # 标示第 1 页页码后是否需要显示省略号
    left_has_more = False

    # 标示最后一页页码前是否需要显示省略号
    right_has_more = False

    # 标示是否需要显示第 1 页的页码号。
    # 因为如果当前页左边的连续页码号中已经含有第 1 页的页码号,此时就无需再显示第 1 页的页码号,
    # 其它情况下第一页的页码是始终需要显示的。
    # 初始值为 False
    first = False

    # 标示是否需要显示最后一页的页码号。
    # 需要此指示变量的理由和上面相同。
    last = False

    # 获得用户当前请求的页码号
    page_number = page.number

    # 获得分页后的总页数
    total_pages = paginator.num_pages

    # 获得整个分页页码列表,比如分了四页,那么就是 [1, 2, 3, 4]
    page_range = paginator.page_range

    if page_number == 1:
        # 如果用户请求的是第一页的数据,那么当前页左边的不需要数据,因此 left=[](已默认为空)。
        # 此时只要获取当前页右边的连续页码号,
        # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 right = [2, 3]。
        # 注意这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
        right = page_range[page_number:page_number + 2]

        # 如果最右边的页码号比最后一页的页码号减去 1 还要小,
        # 说明最右边的页码号和最后一页的页码号之间还有其它页码,因此需要显示省略号,通过 right_has_more 来指示。
        if right[-1] < total_pages - 1:
            right_has_more = True

        # 如果最右边的页码号比最后一页的页码号小,说明当前页右边的连续页码号中不包含最后一页的页码
        # 所以需要显示最后一页的页码号,通过 last 来指示
        if right[-1] < total_pages:
            last = True

    elif page_number == total_pages:
        # 如果用户请求的是最后一页的数据,那么当前页右边就不需要数据,因此 right=[](已默认为空),
        # 此时只要获取当前页左边的连续页码号。
        # 比如分页页码列表是 [1, 2, 3, 4],那么获取的就是 left = [2, 3]
        # 这里只获取了当前页码后连续两个页码,你可以更改这个数字以获取更多页码。
        left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]

        # 如果最左边的页码号比第 2 页页码号还大,
        # 说明最左边的页码号和第 1 页的页码号之间还有其它页码,因此需要显示省略号,通过 left_has_more 来指示。
        if left[0] > 2:
            left_has_more = True

        # 如果最左边的页码号比第 1 页的页码号大,说明当前页左边的连续页码号中不包含第一页的页码,
        # 所以需要显示第一页的页码号,通过 first 来指示
        if left[0] > 1:
            first = True
    else:
        # 用户请求的既不是最后一页,也不是第 1 页,则需要获取当前页左右两边的连续页码号,
        # 这里只获取了当前页码前后连续两个页码,你可以更改这个数字以获取更多页码。
        left = page_range[(page_number - 3) if (page_number - 3) > 0 else 0:page_number - 1]
        right = page_range[page_number:page_number + 2]

        # 是否需要显示最后一页和最后一页前的省略号
        if right[-1] < total_pages - 1:
            right_has_more = True
        if right[-1] < total_pages:
            last = True

        # 是否需要显示第 1 页和第 1 页后的省略号
        if left[0] > 2:
            left_has_more = True
        if left[0] > 1:
            first = True

    data = {
        'left': left,
        'right': right,
        'left_has_more': left_has_more,
        'right_has_more': right_has_more,
        'first': first,
        'last': last,
    }

    return data

参考博客https://www.zmrenwu.com/courses/django-blog-tutorial/materials/21/

视图函数

视图函数返回模板所需要的对象

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage


def teachersViewP(request):
    teachers = Teacher.objects.all()

    paginator = Paginator(teachers, per_page=10)
    page_num = request.GET.get('page', 1)
    try:
        page_num = int(page_num)
    except:
        page_num = 1
    if page_num<1 or page_num>paginator.num_pages:
        page_num = 1
    is_paginated = True
    page_object = paginator.get_page(page_num)
    data = pagination_function(paginator, page_object, is_paginated)
    return render(request, 'teacher.html', locals())

模板实现

模板结合bootstrap框架实现前端分页展示

# 作者-上海悠悠 QQ交流群:717225969
# blog地址 https://www.cnblogs.com/yoyoketang/




	
	Bootstrap 实例 - 分页的状态
	
	
	


分页器加载table表格

{% for field in page_object %} {% endfor %}
姓名 年龄 电话
{{ field.name }} {{ field.age }} {{ field.tel }}
{% if is_paginated %}
    {% endif %} {#上一页按钮开始#} {# 如果当前页有上一页#} {% if page_object.has_previous %} {# 当前页的上一页按钮正常使用#} {% else %} {# 当前页的不存在上一页时,上一页的按钮不可用#} {% endif %} {#上一页按钮结束#} {% if data.first %}
  • 1
  • {% endif %} {% if data.left %} {% if data.left_has_more %}
  • ...
  • {% endif %} {% for i in data.left %}
  • {{ i }}
  • {% endfor %} {% endif %}
  • {{ page_num }}
  • {% if data.right %} {% for i in data.right %}
  • {{ i }}
  • {% endfor %} {% if data.right_has_more %}
  • ...
  • {% endif %} {% endif %} {% if data.last %}
  • {{ paginator.num_pages }}
  • {% endif %} {% if page_object.has_next %} {% else %} {% endif %} {# 下一页按钮结束#}

实现效果

页码效果展示

中间页码显示省略号