如何在 django 模板中设置页面范围的索引

Posted

技术标签:

【中文标题】如何在 django 模板中设置页面范围的索引【英文标题】:how to set index of page range in django templates 【发布时间】:2015-01-18 21:00:18 【问题描述】:

我有以下循环遍历我的分页对象:

% for x in my_paginator.paginator.page_range %
    <a href="?% if query %q= query &amp;% endif %page= x "><u> x </u></a> 

% endfor %

我想切出比当前页面少 4 个索引和比当前页面大 4 个值。

我可以像这样获取当前页面: my_paginator.number

如果页码为“61”并输出如下内容,我如何获得可以使用 x 打印的范围:

57 58 59 60 61 62 63 64 65

【问题讨论】:

【参考方案1】:

您可以从视图中呈现最小和最大限制:

paginator = Paginator(yourqueryset, request.GET.get('show'))
if request.GET.get('page'):
    try:
      results = paginator.page(request.GET.get('page'))
    except PageNotAnInteger:
      results = paginator.page(1)
    except EmptyPage:
      results = paginator.page(paginator.num_pages)
else:
    results = paginator.page(1)
min = all.number - 4
max = all.number + 4
return render(request, 'template.html', 'results':results,'min':min,'max':max)

然后在模板中:

% for page in results.paginator.page_range %
   % if page < max and page > min and page != results.number %
      <a class="page">page</a>
   % elif page == results.number %
      <a>page</a>
   % endif %
% endfor %

然后你会得到类似的东西:

57 58 59 60 61 62 63 64 65

【讨论】:

我知道这是几年前发布的,但我很好奇 all.number 的作用,例如:min = all.number - 4?我在 Google 上搜索并在内置函数中找到了“all”,但格式为:all(iterable),这与您在上面的编写方式不同。【参考方案2】:

我最终这样做了:

% for x in my_paginator|relative_page_list:"5" %

                <a href="?% if query %q= query &amp;% endif %page= x "><u> x </u></a> 

                    % endfor %

模板标签实现如下所示:

from django import template
import string

register = template.Library()

@register.filter(name='relative_page_list')
def relative_page_list(paginator, page_range):
    print 'arg: '+str(page_range)
    print 'page number: '+str(paginator.number)
    page_number = paginator.number
    last_page_number = paginator.paginator.page_range[-1]
    page_range = int(page_range)
    page_min = page_number - page_range
    page_max = page_number + page_range

    print 'min: '+str(page_min)
    print 'max: '+str(page_max)

    if page_min < 0:
        page_min = 0

    if page_max > last_page_number:
        page_max = last_page_number

    print page_min
    print page_max
    return paginator.paginator.page_range[page_min:page_max]

这和谷歌的分页完全一样。

【讨论】:

以上是关于如何在 django 模板中设置页面范围的索引的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板中的“带有模板标签”中设置 Django 渲染块值?

如何在 Django 模板中设置背景图像?

如何在 django 模板中设置自定义 forloop 起点

如何在 django 表单中设置自定义 HTML 属性?

如何在 django 中设置健康检查页面

如何在mysql中设置唯一索引