TemplateView中的Django分页?
Posted
技术标签:
【中文标题】TemplateView中的Django分页?【英文标题】:Django pagination in TemplateView? 【发布时间】:2019-02-20 19:54:48 【问题描述】:TemplateView 中的 Django 分页?
您好,我想弄清楚如何在类视图中访问多个模型并同时进行分页。
我的阅读结果,DjangoDoc 和 ***:
ListView
- 我可以使用paginate_by=
,但我只能加载一个模型。
TemplateView
- 我可以加载很多模型但不能使用paginate_by=
?
例如三个模型:Chicken
、Cows
和 Cats
(我想在我的页面上显示每个模型的最后 3 个条目)。所有模型都有一个模型字段,称为输入日期。
class HomeIndex(TemplateView):
template_name = 'home.html'
paginate_by = 3 # --- something like that
def get_context_data(self, **kwargs):
context = super(HomeIndex, self).get_context_data(**kwargs)
context['chickens'] = Chicken.objects.order_by('-entry_date'')
context['cows'] = Cows.objects.order_by('-entry_date'')
context['cats'] = Cats.objects.order_by('-entry_date')
return context
或者我可以在objects.order_by('-entry_date', < pagination? >)
中添加一些内容。
谢谢
【问题讨论】:
【参考方案1】:Django QuerySet 具有内置的结果切片功能。
Cows.objects.order_by('-entry_date'')[offset:limit]
对于最后 3 个条目,偏移量为 0,限制为 3
Cows.objects.order_by('-entry_date'')[0:3]
或者同样的可以用更pythonic的方式来写
Cows.objects.order_by('-entry_date'')[:3]
要获得最后 3 头牛、猫和鸡,下面的代码可以工作。
def get_context_data(self, **kwargs):
context = super(HomeIndex, self).get_context_data(**kwargs)
context['chickens'] = Chicken.objects.order_by('-entry_date')[:3]
context['cows'] = Cows.objects.order_by('-entry_date')[:3]
context['cats'] = Cats.objects.order_by('-entry_date')[:3]
return context
参考资料:
限制查询link【讨论】:
【参考方案2】:如果您想使用ListView
,您仍然可以通过链接get_queryset(self)
中的查询集并对其进行分页(阅读this answer 以查看chain
和sorted
的解释)。这样就可以使用默认的简单分页了。
from itertools import chain
from operator import attrgetter
class HomeIndex(ListView):
template_name = 'home.html'
paginate_by = 3 # --- somehting like that
def get_queryset(self):
chicken_list = Chicken.objects.all()
cow_list = Cows.objects.all()
cat_list = Cats.objects.all()
result_list = sorted(
chain(chicken_list, cow_list, cat_list),
key=attrgetter('entry_date'),
reverse=True)
return result_list
然后在你的模板中:
% for data in object_list %
data
% endfor %
您可以使用here所示的分页。
【讨论】:
有趣的方法。也适用于其他情况。我尝试通过常规 % for data in result_list % data % endfor % 访问 result_list 但到目前为止没有任何显示`? 尝试访问% for data in object_list %
,这是从模板访问数据的默认名称。然后你可以使用默认的分页对象。我会更新答案。以上是关于TemplateView中的Django分页?的主要内容,如果未能解决你的问题,请参考以下文章
在 Django 中使用 TemplateView 时设置 Mimetype