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 并进行分页,就像您在 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)。
最好的选择可能是继承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。
| 归档时间: |
|
| 查看次数: |
2083 次 |
| 最近记录: |