我刚开始使用Django,所以我有很多问题。我已经构建了一个Mixin来为"下一页"创建paginator模板链接。和GCBV(ListView)中的上一页:
class PageLinksMixin:
page_kwarg = 'page'
def _page_urls(self, page_number):
return "?{pkw}={n}".format(pkw=self.page_kwarg, n=page_number)
def previous_page(self, page):
if page.has_previous():
return self._page_urls(page.previous_page_number())
return None
def next_page(self, page):
if page.has_next():
return self._page_urls(page.next_page_number())
return None
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
page = context.get('page_obj')
if page is not None:
context.update({'previous_page_url': self.previous_page(page),
'next_page_url': self.next_page(page)})
return context
一切似乎都有效。但我根本看不到某些函数输入的创建位置。特别是" page"," page_number"。 使用CBV,有必要声明:
page = paginator.page(page_number)
但是在GCBV中,这显然是不必要的,这意味着属性是在某处创建的,后来继承了。 对于ListView,有一个函数 def paginate_queryset ,但在那里页面只在本地范围内声明,而不是在全局范围内声明。有人可以向我解释一下吗?我真的很困惑,并试图解决这个问题一段时间了。
这是视图:
class TagList(PageLinksMixin, ListView):
template_name = 'organizer/tag_list.html'
paginate_by = 5
model = Tag
答案 0 :(得分:1)
Django泛型ListView
有一个paginator对象,它通过self.get_context_data()
添加到上下文中。这是Django的源代码:
def get_context_data(self, **kwargs):
"""
Get the context for this view.
"""
queryset = kwargs.pop('object_list', self.object_list)
page_size = self.get_paginate_by(queryset)
context_object_name = self.get_context_object_name(queryset)
if page_size:
paginator, page, queryset, is_paginated = self.paginate_queryset(queryset, page_size)
context = {
'paginator': paginator,
'page_obj': page,
'is_paginated': is_paginated,
'object_list': queryset
}
else:
context = {
'paginator': None,
'page_obj': None,
'is_paginated': False,
'object_list': queryset
}
if context_object_name is not None:
context[context_object_name] = queryset
context.update(kwargs)
return super(MultipleObjectMixin, self).get_context_data(**context)
在你的mixin中,首先调用super().get_context_data()
,它使用paginator和一个页面对象填充上下文,你设置为page
:
page = context.get('page_obj')
最后,您调用self.previous_page(page)
来获取实际的URL并将其添加到上下文中。没什么了不起的。
你也可以从kwargs
和[{1}}实例中page
获取page_number,但由于它已经为你完成了,paginator
在上下文中是最简单的方法。