给出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中分页结果”问题...
答案 0 :(得分:4)
您最好的选择可能是继承ListView而不是DetailView,并覆盖get_queryset
以获取合作伙伴的讲座。如果需要,您也可以在get_context_data
中添加合作伙伴对象。
答案 1 :(得分:1)
你好我将使用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