TemplateView中的Django分页?
您好,我试图弄清楚如何在类视图中访问多个模型并同时进行分页。
阅读后的我的结局,DjangoDoc和Stackoverflow:
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? >)
中添加一些内容。
谢谢
答案 0 :(得分:1)
如果您想使用ListView
,则仍然可以通过在get_queryset(self)
中链接查询集并对其进行分页(阅读this answer来查看chain
和{{1} }解释)。这样,您可以使用默认的简单分页。
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
您可以使用here所示的分页。
答案 1 :(得分:1)
Django QuerySet具有内置的结果切片。
Cows.objects.order_by('-entry_date'')[offset:limit]
对于最后3个条目,偏移量为0,限制为3
Cows.objects.order_by('-entry_date'')[0:3]
或者可以用更Python化的方式编写
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
参考文献: