为啥即使数据库中没有对象,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_pageTrue,那么空页面仍然是页面。这意味着即使没有对象,num_pages 也是一个。如果allow_empty_first_pageFalse,那么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 方法中也只得到一个对象。任何人都知道为啥

Django分页器

Django分页解析

Django -- 分页 -- 批量导入

[Django学习]分页

django之快速分页