【问题标题】:Displaying Page Numbers with django-tables2使用 django-tables2 显示页码
【发布时间】:2013-05-07 00:12:15
【问题描述】:

我目前正在使用 django-tables2 显示数据集。

文档没有特别提到这一点,所以我猜这可能需要一些表覆盖 - 但是,我希望那里有人已经完成了这一点。

如何在表格下方使用 django-tables2 呈现页码?我希望能够显示的是用户可以单击的页码水平列表。

提前致谢。

【问题讨论】:

    标签: python django django-tables2


    【解决方案1】:

    您需要创建一个自定义页面呈现模板 - 您不需要覆盖任何类。

    为此,首先复制文件

    PYTHON\Lib\site-packages\django_tables2\templates\django_tables2\table.html

    到您的 django 应用程序中的 templates 目录,并将其重命名为 mytable.html 或您喜欢的任何其他名称。

    现在,您需要更改该文件的 分页 块。有很多方法可以做你喜欢的事情,但一个简单的方法是在分页块内添加以下行(你可以根据你的具体需要删除或保留那里的其他内容):

    {% 块分页.allpages %} {% for p in table.paginator.page_range %} {{ p }} {% endfor %} {% endblock pagination.allpages %}

    最后,要使用您的模板,只需将您的自定义模板名称传递给 render_table 命令:

    {% 从 django_tables2 加载 render_table %} ... {% render_table table "mytable.html" %}

    这很简单,如果你有很多页面会给你带来麻烦(所以你必须使用一些ifs 来通过table.paginator.num_pages 变量检查页面数)。此外,您可以使用table.page.number 变量突出显示当前页面并禁用链接。

    以上内容留给读者作为练习:)

    【讨论】:

    • 谢谢!实际上,我最终通过安装 bootstrap-pagination 并编写自己的分页函数来解决这个问题。然而,由于反应和特异性而被提升。
    【解决方案2】:

    改进@Serafeim 答案(或解决他留下的练习):这是一个分页块,仅使用 Django 模板语法,呈现页码:

    • 包含在一个<ul> HTML 块中,其中的 CSS 类与 Bootstrap “配合得很好”;

    • 如果超过8页,当前页面上下最多显示3页;

    • 始终显示第一页和最后一页,在它们与范围的开头或结尾之间使用省略号(如果需要)。

       {% with current_page=table.page.number page_count=table.paginator.num_pages rows_per_page=table.page.object_list|length total_rows=table.page.paginator.count %}
       {% block pagination %}
       <ul class="pagination">
           {% block pagination.allpages %}
               <li class="current">
                   {% blocktrans %}Page {% endblocktrans %}
               </li>
               {% for page in table.paginator.page_range %}
                   {% with range_start=current_page|add:"-3" range_end=current_page|add:"3" page_count_minus_5=page_count|add:"-5" page_count_minus_1=page_count|add:"-1" %}
                       {% if page == current_page %}
                           <li class="active">
                               <span>{{ page }}</span>
                           </li>
                       {% elif page == 1 or page >= range_start and page <= range_end or page == page_count %}
                           <li class="next">
                               <a href="{% querystring table.prefixed_page_field=page %}">{{ page }}</a>
                           </li>
                       {% endif %}
                       {% if page == 1 and current_page > 5 or page == page_count_minus_1 and current_page <= page_count_minus_5 %}
                           <li class="current">...</li>
                       {% endif %}
                   {% endwith %}
               {% endfor %}
           {% endblock pagination.allpages %}
      
           {% block pagination.cardinality %}
               <li class="cardinality">
                   {% if total_rows != rows_per_page %}{% blocktrans %}
                       {{ rows_per_page }} of {{ total_rows }}{% endblocktrans %}
                   {% else %}
                       {{ total_rows }}
                   {% endif %} 
                   {% if total_rows == 1 %}
                       {{ table.data.verbose_name }}
                   {% else %}
                       {{ table.data.verbose_name_plural }}
                   {% endif %}
               </li>
           {% endblock pagination.cardinality %}
       </ul>
       {% endblock pagination %}
       {% endwith %}
      

    【讨论】:

    • '{% if page == 1 and current_page > 5 or pagina...'行中的'pagina'变量应该是'page'。我对该更改进行了测试,它似乎按预期工作,但我无法自己编辑答案,因为它少于 6 个字符的更改。
    • @lxmmxl56 你是对的,我的错误......当你将变量名翻译成英文并且不测试代码时会发生这种情况。已更正。谢谢!
    【解决方案3】:

    在版本# >= 2.0.0 中引入了分页 https://django-tables2.readthedocs.io/en/latest/pages/CHANGELOG.html

    只需在 settings.py 中添加以下代码。带有数字的分页将使用 bootstap 4 样式呈现。确保您在 html 模板中有 bootstrap 4 参考。

    DJANGO_TABLES2_TEMPLATE = 'django_tables2/bootstrap4.html'
    

    并在文档中查看更多样式。 https://django-tables2.readthedocs.io/en/latest/pages/custom-rendering.html#available-templates

    【讨论】:

    • 这只会改变表格的样式(不是分页器)
    • 仅供参考,从 v2.4.1 开始,如果您的表的 Meta 类覆盖 template_name,这将优先于 settings.py 中定义的任何内容。请参阅源中的相关部分code
    猜你喜欢
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多