【问题标题】: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 %}

我还没有足够的数据来测试它,但这是正确的方法吗?还有其他更好的吗?

【问题讨论】:

    标签: python django pagination django-templates django-views


    【解决方案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 %} 正是我需要决定是否显示分页导航。
    猜你喜欢
    • 1970-01-01
    • 2018-08-13
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多