从Django DetailView分页

Bob*_*hue 2 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)
Run Code Online (Sandbox Code Playgroud)

我有每个的ListView和每个的DetailView(工作正常)。

问题是在“ Partner DetailView”页面上,我有“讲座”列表。在很多情况下,此列表可能会很长(例如,> 200),并且涉众希望对其进行分页。我在ListView页面上的分页没有问题(很简单),但是我似乎无法在合作伙伴的DetailView页面上弄清楚如何在他们的演讲列表上进行分页。

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

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

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

有支持吗?还是会需要更多的自定义视图代码(也许将** kwargs中的'page'变量放入get_context_data()并基于该变量创建子集)?

在CBV下,这似乎是非常普遍的情况,所以我很困惑为什么搜索没有找到任何示例。

更新:我应该想到,执行此操作的一种简单方法是,将一个“页面”片段添加到引用DetailView的url()条目中,然后使用它在FK对象上创建分页的子集。

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

小智 9

MultipleObjectMixin 与 DetailView

你好。我将使用 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
Run Code Online (Sandbox Code Playgroud)

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

{% if is_paginated %}
    {% include "includes/pagination.html" %}
{% endif %}
Run Code Online (Sandbox Code Playgroud)

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


Dan*_*man 5

最好的选择可能是继承ListView而不是DetailView,然后重写get_queryset以从合作伙伴那里获得讲座。get_context_data如果需要,也可以在其中添加Partner对象。


Mak*_*ks 5

为了扩展@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
Run Code Online (Sandbox Code Playgroud)

因此,后来我添加了一个标准 Django 分页模板(从文档复制)并迭代 related_activities。