Django+paginator实现分页+省略号代替多余页码+页面跳转(分页最全功能all_in)

个人拙见,可能还有更好的办法,望指正!

先上图看一下效果:

在这里插入图片描述
js插件引入:

  1. jQuery
  2. bootstrap

借图分析功能点(注意参数代表的意义):

  1. 页数 num_pages <= 12 时:页码不加省略号,所有页码全部显示.
    形如:< 1 2 3 4 5 6 7 8 9 10 11 12 >
  2. 页数 num_pages > 12 时:页码加省略号显示.
    形如:< 1 2 3 4 5 6 7 8 9 10 … 20 >

将情况理清楚之后,接着分析加省略号之后的逻辑情况
注意:此时分析的是 num_pages > 12

  1. 当request请求页码数 page.number >= 1 and page.number <= 10
    显示样式:< 1 2 3 4 5 6 7 8 9 10 … 20 >
  2. 当request请求页码数 page.number == num_pages,也就是最后一页:
    显示样式:< 1 2 3 4 5 6 7 8 9 10 … 20 >
    (同上)
  3. 当request请求页码数 page.number == 11
    显示样式:< 1 2 3 4 5 6 7 8 9 10 11 … 20 >
  4. 当request请求页码数 page.number == lastButOne,也就是倒数第二页:
    显示样式:< 1 2 3 4 5 6 7 8 9 10 … 19 20 >
  5. 以上格式都不是,也就是 page.number > 11 and page.number < lastButOne
    显示样式:< 1 2 3 4 5 6 7 8 9 10 … 15 … 20 >

分析好逻辑思想之后再来看代码就不会那么迷糊了:
这里需要解释一下,因为使用的是Django框架,我这里将结合前后端来进行上述思想的逻辑判断,当然也可以使用JS来进行,也可以使用后端来判断,减少前端运行压力。

HTML分页代码


views后端代码

	# 一页十条数据
    paginator = Paginator(Data, 10)
    # 获取页码,默认第一页
    page_num = request.GET.get('page', '1')
    try:
        Page = paginator.page(page_num)
    except(PageNotAnInteger, EmptyPage, InvalidPage):
        Page = paginator.page('1')
     #这里是后端逻辑判断
    if Page.paginator.num_pages >= 13:
        ifEllipsis = 1
        range1 = range(1, 13)
        range2 = range(1, 15)
        range3 = range(1, 14)
        lastButOne = Page.paginator.num_pages - 1
    else:
        ifEllipsis = 0

这里需要解释一下range1、range2、range3:
       因为Django框架在模板标签{%for%}中是不能直接使用range(1,12)的,所以通过后端传进去之后就可以使用range进行for遍历了。。。。(有一种钻牛角尖的丫子)

接下来介绍如何实现跳转:

上述HTML代码最后已经有跳转的button了,接下来就是解释如何实现链接跳转。

我使用了一个js方法来控制向后端发送GET请求,链接末尾加上pageNum,发送给后端,具体方法如下:


到此,上述功能全部描述完毕。

如果有错误,麻烦指正,如果有更好的方法,请评论或者私信,感激不尽!^_^

你可能感兴趣的:(paginator)