在通用CBV中创建分页的模板链接

时间:2017-08-16 14:35:15

标签: django django-views

我刚开始使用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

1 个答案:

答案 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在上下文中是最简单的方法。