Django DetailView的分页

时间:2014-08-29 13:41:01

标签: django pagination detailview

给出models.py:

class Partner(models.Model):
    ... (fields irrelevant to this example)

class Lecture(models.Model):
    ... (other fields not relevant to this example)
    partner models.ForeignKey(Partner)

每个都有一个ListView,每个都有一个DetailView(工作正常)。

问题是在Partner DetailView页面上,我有Lectures列表。在许多情况下,该列表可能很长(例如,> 200),并且利益相关者希望它被分页。我对ListView页面上的分页没有任何问题(这很简单),但我似乎无法在Partner的DetailView页面上弄清楚如何在他们的Lecture列表中进行分页。

我希望在Django文档代码中看到类似的内容:

class PartnerDetailView(DetailView):
    model = Partner
    paginate_using = Lecture # (or something like self.lecture ?)
    paginate_by = 20

因此,DetailView将作用于单个Partner对象,但会(轻松)允许从Lecture FK结果中分页。

对此有支持吗?或者它是否需要更多的自定义视图代码(可能将'page'变量放在** kwargs中用于get_context_data()并根据该变量创建子集)?

这似乎是CBV下非常常见的情况,所以我很困惑为什么搜索没有出现任何例子。

更新:我应该想到,一个简单的方法就是将一个“页面”片段添加到引用DetailView的url()条目中,并使用它来创建FK上的分页子集对象。

请注意,这也可能是一种可行的方法来解决“如何从FormView中分页结果”问题...

3 个答案:

答案 0 :(得分:4)

您最好的选择可能是继承ListView而不是DetailView,并覆盖get_queryset以获取合作伙伴的讲座。如果需要,您也可以在get_context_data中添加合作伙伴对象。

答案 1 :(得分:1)

具有DetailView的MultipleObjectMixin

你好我将使用MultipleObjectMixin并具有分页功能,就像在ListView中一样。

from django.views.generic.detail import DetailView
from django.views.generic.list import MultipleObjectMixin

class PartnerDetailView(DetailView,MultipleObjectMixin):
    model = Partner
    paginate_by = 5

    def get_context_data(self, **kwargs):
        object_list = Lecture.objects.filter(partner=self.get_object())
        context = super(PartnerDetailView, self).get_context_data(object_list=object_list, **kwargs)
        return context

现在,您可以在模板中使用object_list(与该合作伙伴相关的所有讲座)并使用分页。

{% if is_paginated %}
    {% include "includes/pagination.html" %}
{% endif %}

在“ includes / pagination.html”中,您可以访问分页上下文(page_obj)。

答案 2 :(得分:0)

要扩展@MsCheikh答案,我将提供没有MultipleObjectMixin的版本。我的

的示例
class DealDetailView(DetailView):
    model = Deal
    template_name = "crm/deals/deal_detail.html"

    def get_context_data(self, **kwargs):
        context = super(DealDetailView, self).get_context_data(**kwargs)
        activities= self.get_related_activities()
        context['related_activities'] = activities
        context['page_obj'] = activities 
        return context

    def get_related_activities(self):
        queryset = self.object.activity_rel.all() 
        paginator = Paginator(queryset,5) #paginate_by
        page = self.request.GET.get('page')
        activities = paginator.get_page(page)
        return activities

所以后来我包括标准的Django分页模板(从文档复制),并遍历related_activities