forloop.counter结合第三方分页插件dj-pagination的趣用

问题:我们在使用dj-pagination插件进行分页的时候,可能会遇到一种问题,就是当点击第二页的时候,序号又是从1开始的,但是我们希望序号是接着第一页累计增加的。如果页面显示的数据是从某种数据库读取的,如mysql,mongodb,而需要显示的数据刚好和数据库存的id是一一对应的,那就不存在这个问题。所以,遇到这种问题,不能直接借助数据库的id来计数,又该怎么实现这个效果呢?


django版本:2.0.2

dj-pagination:2.3.2


步骤:

1.安装dj-pagination。 pip install dj-pagination

2.在setting.py中进行配置。

(1)安装应用。

            INSTALLED_APPS = [
                ...
                'dj_pagination',
            ]

(2)添加中间件。

            MIDDLEWARE = [
                ...
                'dj_pagination.middleware.PaginationMiddleware',

            ]

3.在显示分页的html页面中需要显示分页页面处加入:

            {% load pagination_tags %}    

            {% autopaginate data 20%}   #data是自己定义的变量名,代表从后台传回的需要显示的所有object的集合(总量)

                                                                  #20  代表分页的数量,即每页显示的数据个数

            {% paginate %}    #这句话代表分页页码

4.如果我们需要自定义dj_pagination的模板样式,需要找到dj_pagination包中的templates/pagination/pagination.html。将pagination/pahination.html复制到django项目templates下。这样可以自定义分页模板,比如更改其css样式以更美观地显示分页页码。

5.以上步骤我们已经基本可以将数据进行分页显示。如果我们需要对数据进行标记顺序,一般会想到使用forloop.counter进行计数。比如:{{ forllop.counter }} 。这样每一个分页,都会从1开始计数。

但我们希望分页后能连续计数,比如每页分页20个,那么第二页是从21开始的,第三页是从41开始的。forloop.counter只代表一页的数量,即1-20。

那么要获取第二页的第一个数21,一般我们是:(2-1)× 20 + 1= 21

那么要获取第三页的第一个数21,一般我们是:(3-1)× 20 + 1 = 41

那么要获取第四页的第五个数21,一般我们是:(4-1)× 20 + 5 = 65

...

即:(当前的页码 - 1)× 每页分页的数量 + 当页增加的数: 

所以我们需要得到的是几个变量:当前的页码,每页分页的数量,当页增加的数

其中,每页分页的数量是我们自定义的,比如:20;

当页增加的数用forloop.counter就可以获得。

比较难的可能是不知道怎么获取当前的页码。

所以,每一条数据代表的数:(当前的页码 - 1)× 20 + forloop.counter:


那么如何获取当前的页码其实是最关键的。通过一段时间的研究,后来发现其实可以从templates/pagination/pagination.html 中获取。在去看pagination.html 中获取。在去看代码:

{% ifequal page page_obj.number %}

  • {{ page }}

  • {% else %}

    其中,page_obj.number 代表的就是当前的页码。


    所以,接下来我们要做的,就是如何定义过滤器。

    需要我们进行以下操作:

    (1)在显示分页的html页面中需要显示数据计数的html标签处,如:

           {{ page_obj.number |multiply:20|add:forloop.counter }}

    (2)在应用app目录下创建一个python package,命名为:templatetags.

              在其中创建一个py文件,如:abc_tags.py。在其中写入:

               from django import template

               register = template.Library()

               @register.filter

                def multiply(value, num):

                        return (value -1 ) * num

            #注释:value 代表的是 page_obj ,num代表的就是 每页分页的数量———20。

      (3)在显示分页的html页面 顶部引入自定义过滤器:{% load abc_tags %}

    这样就可以实现分页连续计数的效果了。

    ==========================================

    进阶:如果希望每页分页的数量的控制可以通过在setting中进行控制。可以进行如下操作:

    (1)在应用app目录下创建py文件,命名:context_processors.py , 在其中写入:

        from django.conf import settings

        def pageNums(request):

               return {"HAYSTACK_SEARCH_RESULTS_PER_PAGE":settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE}

    (2)在setting.py中写入:

    #the number of pages
    HAYSTACK_SEARCH_RESULTS_PER_PAGE = 20

       (3)将'应用app名称.context_processors.pageNums'加入到setting.py的

    TEMPLATES = [

        {

              ...

              OPTIONS:{

                      'context_processors':[

                                ...

                                '应用app名称.context_processors.pageNums'

                       ]

               }

        }]

    (4)在显示分页的html页面中需要显示数据计数的html标签处写入:

    {{ page_obj.number |multiply:HAYSTACK_SEARCH_RESULTS_PER_PAGE|add:forloop.counter }}

     

    这样,我们直接可以在setting中去设置分页的数量了。但需要注意的是,HAYSTACK_SEARCH_RESULTS_PER_PAGE的值需要与

    {% autopaginate data 20%} 中设置数量的(比如这里的20)需要一致。






    你可能感兴趣的:(forloop.counter结合第三方分页插件dj-pagination的趣用)