为啥即使数据库中没有对象,django paginator.num_pages 也会返回一个?
Posted
技术标签:
【中文标题】为啥即使数据库中没有对象,django paginator.num_pages 也会返回一个?【英文标题】:Why does django paginator.num_pages returns one even when no objects are in db?为什么即使数据库中没有对象,django paginator.num_pages 也会返回一个? 【发布时间】:2013-11-24 13:04:49 【问题描述】:我想为我的模型创建一个分页器,但我希望仅当我的数据库中保存有模型时才显示分页。
我在我的模板中尝试过
% if page.paginator.num_pages != 0 %
#show pagination ul
%endif%
但是没有用。显然,即使 objlist 中没有任何对象,创建时分页器对象也始终只有一页。我不得不使用 object_list.count() 方法解决这个问题
% if page.object_list.count != 0 %
#show pagination ul
% endif %
我还没有足够的数据来测试它,但这是正确的方法吗?还有其他更好的吗?
【问题讨论】:
【参考方案1】:使用allow_empty_first_page=False
实例化分页器(请参阅documentation)此可选参数默认为True
。
如果allow_empty_first_page
是True
,那么空页面仍然是页面。这意味着即使没有对象,num_pages
也是一个。如果allow_empty_first_page
是False
,那么num_pages
可以为零。
然后您可以像往常一样遍历page.paginator.page_range
:
% for page_number in page.paginator.page_range %
# show link to page
% endfor %
这不会显示任何分页链接,因为page_range
最终会成为一个空列表。
【讨论】:
我最终使用了 count 方法,因为我想创建一个“动态”分页器。我不想显示所有页面,但试图只显示一些(例如前 5 个)然后是点(...)然后是最后一个。所以 paginator.page_range 并没有这样做,因为它遍历每个页面。【参考方案2】:如果分页器是用allow_empty_page=True
实例化的,那么即使没有对象,它也会有一页。请参阅paginator docs 了解更多信息。
如果要在对象列表中至少有一个对象时显示分页器,请使用:
% if page.object_list.count %
#show pagination ul
% endif %
如果你只希望分页器在多页时出现,那么使用:
% if page.paginator.num_pages > 1 %
#show pagination ul
%endif%
【讨论】:
是的,这就是我的做法,正如您在我的帖子中使用计数所看到的那样。但是用零值检查,因为我没有在文档中看到 allow_empty_page :) 谢谢! +1% if page.paginator.num_pages > 1 %
正是我需要决定是否显示分页导航。以上是关于为啥即使数据库中没有对象,django paginator.num_pages 也会返回一个?的主要内容,如果未能解决你的问题,请参考以下文章
即使我使用了 ScrapyItem.objects.all(),我在 django rest 框架的 APIView 内的 post 方法中也只得到一个对象。任何人都知道为啥