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

Python Django中基于日期的通用视图分页,python,django,pagination,Python,Django,Pagination,我有一个很简单的问题。我想在Django站点上创建一些基于日期的通用视图,但我也想对它们进行分页。根据文档,object_list视图有page和paginate_by参数,而archive_month视图没有。“正确”的方法是什么?基于日期的通用视图没有分页。似乎您也无法通过包装它们来添加分页,因为它们返回渲染结果 在这种情况下,我只想写下我自己的观点。您也可以查看泛型视图的代码,但在您的案例中,大部分代码可能是不需要的 因为你的问题是有效的,看看代码;我想知道为什么他们没有将queryset

我有一个很简单的问题。我想在Django站点上创建一些基于日期的通用视图,但我也想对它们进行分页。根据文档,object_list视图有page和paginate_by参数,而archive_month视图没有。“正确”的方法是什么?

基于日期的通用视图没有分页。似乎您也无法通过包装它们来添加分页,因为它们返回渲染结果

在这种情况下,我只想写下我自己的观点。您也可以查看泛型视图的代码,但在您的案例中,大部分代码可能是不需要的


因为你的问题是有效的,看看代码;我想知道为什么他们没有将queryset生成作为单独的函数进行解耦。您可以使用它们,然后根据需要进行渲染。

我创建了一个模板标记,用于对传递给尚未分页的模板的集合进行基于模板的分页。将以下代码复制到
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])
要在模板中使用它(假设我们传入了一个名为项的未分页列表):

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

{{ page.paginator.num_pages }}

昨天我正在处理一个类似的问题,我个人发现最好的解决方案是对所有基于日期的页面使用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)
其中url.py的内容如下:

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

我发现这是解决这个问题的最简单方法,而无需黑客攻击其他通用视图或编写自定义视图。

Django基于日期的通用视图不支持分页。这上面有一个问题。如果需要,可以尝试提供的代码修补程序来实现此功能。我不知道为什么这些补丁还没有应用到代码库中。

还有一个优秀的附加组件,它完全独立于底层视图。

是的,这正是我要寻找的,用于生成基于日期参数的queryset的函数。如果我有,那么我可以使用object_list或pagination对象。现在,我想我必须写我自己的观点。我自己也对django的一般观点感到失望,并且基本上已经编写了一个通用的视图工厂类型god方法,因此我没有这里提到的限制。+1尽管它需要您向额外的上下文添加额外的信息,以补偿基于日期的视图传递的额外变量(年、月等)。
url(r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/$',
    view=path.to.generic_view,
    name='archive_month'),