TemplateView中的Django分页?

Posted

技术标签:

【中文标题】TemplateView中的Django分页?【英文标题】:Django pagination in TemplateView? 【发布时间】:2019-02-20 19:54:48 【问题描述】:

TemplateView 中的 Django 分页?

您好,我想弄清楚如何在类视图中访问多个模型并同时进行分页。

我的阅读结果,DjangoDoc 和 ***:

ListView - 我可以使用paginate_by=,但我只能加载一个模型。

TemplateView - 我可以加载很多模型但不能使用paginate_by=

例如三个模型:ChickenCowsCats(我想在我的页面上显示每个模型的最后 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 以查看chainsorted 的解释)。这样就可以使用默认的简单分页了。

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 打印变量

如何在 django 中为上下文对象执行分页?

在 Django 中使用 TemplateView 时设置 Mimetype

Django TemplateView 线程安全

Django TemplateView 与 DetailView

Django:使用TemplateView在Django表单中添加编辑和删除功能的问题