Django模板截断列表以显示前n个元素

时间:2015-08-06 04:12:10

标签: python html django list django-templates

我有一个Django模板,我试图在html中将列表显示为无序列表。目前,我使用|length|slice以非常混乱的方式完成了它:

{% if list_tasks %}
  The following tasks will be removed from this group:
   <ul>
  {% for task in list_tasks|slice:":10" %}
    <li>{{ task.name }}</li>
  {% endfor %}
    {% if list_tasks|length > 10 %}
      <li>...and {{ list_tasks|length|add:"-10" }} other tasks</li>
    {% endif %}
  </ul>
{% endif %}

如果list_tasks有253个元素,则输出如下:

The following tasks will be removed from this group:
  - T06/081
  - T15/0395
  - T15/0545
  - T11/723
  - T13/758
  - T14/1532
  - T14/1512
  - T14/1510
  - T04/154
  - T14/1528
  - ...and 243 other tasks

是否有更简洁,更清洁的方法?

1 个答案:

答案 0 :(得分:1)

我说你的解决方案并不是那么糟糕:)

<强> 1 但有些人可能会提到,如果在模板中需要的不仅仅是最基本的格式化操作,那么最好在视图中格式化截断列表。

看起来你正在以与其他实际任务相同的方式显示最后的“......其他任务”行,因此这将是最干净的方法。

在您的视图中有类似的内容,然后在模板中访问truncated_tasks:

truncate_to = 10
truncated_tasks = tasks[:truncate_to]
if len(tasks) > truncate_to:
    truncated_tasks.append('...and %s other task(s)' % (len(tasks)-truncate_to))

<强> 2 虽然,根据受众情况,我可能更愿意将整个列表推送到模板并使用js片段/插件来隐藏/显示其他条目,以防有人想要查看/复制粘贴完整列表:)