Django中基于日期的通用视图的分页

时间:2009-03-21 20:08:57

标签: python django pagination

我有一个非常简单的问题。我想在Django网站上制作一些基于日期的通用视图,但我也想对它们进行分页。根据文档,object_list视图具有page和paginate_by参数,但archive_month视图没有。什么是“正确”的方式呢?

5 个答案:

答案 0 :(得分:3)

我创建了一个模板标记,用于对传递给尚未分页的模板的集合执行基于模板的分页。将以下代码复制到app/templatetags/pagify.py文件。

from django.template import Library, Node, Variable
from django.core.paginator import Paginator
import settings

register = Library()

class PagifyNode(Node):
    def __init__(self, items, page_size, varname):
        self.items = Variable(items)
        self.page_size = int(page_size)
        self.varname = varname

    def render(self, context):
        pages = Paginator(self.items.resolve(context), self.page_size)
        request = context['request']
        page_num = int(request.GET.get('page', 1))

        context[self.varname] = pages.page(page_num)
        return ''

@register.tag
def pagify(parser, token):
    """
    Usage:

    {% pagify items by page_size as varname %}
    """

    bits = token.contents.split()
    if len(bits) != 6:
        raise TemplateSyntaxError, 'pagify tag takes exactly 5 arguments'
    if bits[2] != 'by':
        raise TemplateSyntaxError, 'second argument to pagify tag must be "by"'
    if bits[4] != 'as':
        raise TemplateSyntaxError, 'fourth argument to pagify tag must be "as"'
    return PagifyNode(bits[1], bits[3], bits[5])

在模板中使用它(假设我们传入了一个名为 items 的非分页列表):

{% load pagify %}

{% pagify items by 20 as page %}
{% for item in page %}
    {{ item }}
{% endfor %}

page_size参数(20)也可以是变量。标记会自动检测查询字符串中的page=5个变量。如果您需要访问属于该页面的分页器(例如,对于页面计数),您只需调用:

{{ page.paginator.num_pages }}

答案 1 :(得分:2)

基于日期的通用视图没有分页。看起来你不能通过包装它们来添加分页,因为它们会返回渲染结果。

在这种情况下,我只想写自己的观点。您也可以查看通用视图的代码,但在您的情况下大部分可能都不需要。

因为您的问题是有效的,并且查看代码;我想知道他们为什么不将查询集生成解耦为单独的函数。您可以根据需要使用它们并进行渲染。

答案 2 :(得分:1)

我昨天正在处理与此类似的问题,我发现个人最好的解决方案是对所有基于日期的页面使用object_list通用视图,但是传递过滤的查询集,如下所示:

import datetime, time

def post_archive_month(request, year, month, page=0, template_name='post_archive_month.html', **kwargs):
    # Convert date to numeric format
    date = datetime.date(*time.strptime('%s-%s' % (year, month), '%Y-%b')[:3])
    return list_detail.object_list(
      request,
      queryset = Post.objects.filter(publish__year=date.year, publish__date.month).order_by('-publish',),
      paginate_by = 5,
      page = page,
      template_name = template_name,
      **kwargs)

urls.py的内容如下:

url(r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/$',
    view=path.to.generic_view,
    name='archive_month'),

我发现这是解决问题的最简单方法,而不会诉诸于攻击其他通用视图或编写自定义视图。

答案 3 :(得分:1)

还有一个出色的django-pagination插件,它完全独立于底层视图。

答案 4 :(得分:0)

Django基于日期的通用视图不支持分页。这有一个open ticket from 2006。如果需要,可以尝试提供的代码补丁来实现此功能。我不确定为什么修补程序尚未应用于代码库。

相关问题