问题:我们在使用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进行计数。比如:
但我们希望分页后能连续计数,比如每页分页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 %}
{% else %}
其中,page_obj.number 代表的就是当前的页码。
所以,接下来我们要做的,就是如何定义过滤器。
需要我们进行以下操作:
(1)在显示分页的html页面中需要显示数据计数的html标签处,如:
(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标签处写入:
这样,我们直接可以在setting中去设置分页的数量了。但需要注意的是,HAYSTACK_SEARCH_RESULTS_PER_PAGE的值需要与
{% autopaginate data 20%} 中设置数量的(比如这里的20)需要一致。