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

Posted

技术标签:

【中文标题】Django模板截断列表以显示前n个元素【英文标题】:Django template truncate list to show first n elements 【发布时间】:2015-10-29 01:37:34 【问题描述】:

我有一个 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】:

我想说你的解决方案还不错:)

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 sn-p/plugin 隐藏/显示其他条目,以防万一有人想查看/复制粘贴完整列表:)

【讨论】:

以上是关于Django模板截断列表以显示前n个元素的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Django 模板引擎上截断/切片字符串?

在Django中截断文本但向后方向

Django模板 - 查找列表中的至少一项是不是出现在其他列表中

Django 模板渲染

突出显示活动导航:django 1.4.2

Django 模板列表的第一个元素