我有一个非常简单的问题。我想在Django网站上制作一些基于日期的通用视图,但我也想对它们进行分页。根据文档,object_list视图具有page和paginate_by参数,但archive_month视图没有。什么是“正确”的方式呢?
答案 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。如果需要,可以尝试提供的代码补丁来实现此功能。我不确定为什么修补程序尚未应用于代码库。