您的位置:首页 > 编程语言 > Go语言

django学习——如何实现分页时序号的连续

2018-01-27 13:49 309 查看
在django中,一般通过自带的Paginator进行分页,具体内容可以见官方文档

我们在对数据进行循环时,如果需要标上序号,可以采用forloop方法,如下所示:

{{ forloop.counter }}


具体使用细节,可以见我之前的博客:采用forloop对模板中的数据进行排序

然而,通过这种方法,在点击下一页后,序号还是从1开始,不能接着上一页中的最后一个的序号累加。解决思路如下:

获得当前页面的页码,乘以每页展示的对象数目,在加上{{ forloop.counter }}即可

当前页面的页码可以通过
page.number
获得

django 中的模板中不能进行加减乘除运算,直接能通过过滤器实现,加法的过滤器是
|add
,并没有乘法的过滤器,因此我们需要自定义一个乘法过滤器

每个页面展示的对象数目可以在setting.py中定义,然而模板中是不能直接获得该常量的,需要将该常量添加到上下文管理器中

针对以上思路,具体操作如下:

1、自定义乘法过滤器

原理见官方文档,这里只给出步骤:

首先在你的项目下,建立一个
templatetags
的包,里面新建一个py文件,名字任意,本人的如下:



blog_tags.py
中写入:

from django import template

register = template.Library()

@register.filter
def multiply(value, num):
#定义一个乘法过滤器
return (value-1)*num


在模板中,可以这么写:

{% load blog_tags %}

...
{{ page.number|multiply: 5 }}


这里page.number代表当前页面的页码,也就是第几页,对应的是刚才定义的过滤器
multiply
函数中的
value
值。 5对应的是函数中的num值。

这样,在其基础上加上forloop.counter即可,如下:

{{ page.number|multiply: 5|add:forloop.counter }}


2、将setting.py中的常量添加到模板中

上面的代码中显示的每页数目是5,当对其改变的话,还需要将模板中的都改过来,如果页面多的话,改起来很麻烦,不符合程序设计原则。我们可以将值在setting.py中设定,然后添加到上下文管理器中,这样在整个模板中就可以用了。

本方法参考于:https://stackoverflow.com/questions/433162/can-i-access-constants-in-settings-py-from-templates-in-django

首先,在setting.py中设定每页的数量

HAYSTACK_SEARCH_RESULTS_PER_PAGE = 5  #分页数目


然后,在你的app目录下建立一个
context_processors.py
,写入:

from django.conf import settings

def pageNums(request):
return {"HAYSTACK_SEARCH_RESULTS_PER_PAGE": settings.HAYSTACK_SEARCH_RESULTS_PER_PAGE}


然后,再将其在setting.py中的
context_processors
进行绑定,如下:

TEMPLATES = [
{
...
'OPTIONS': {
...
'blog.context_processors.pageNums',
],
},
},
]


最后,直接在模板中就可以使用该变量
HAYSTACK_SEARCH_RESULTS_PER_PAGE


如下:

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


如此,即可实现翻页后序号的连续。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: