【发布时间】:2010-12-01 11:10:15
【问题描述】:
在 Django 应用程序中,我想以表格形式显示模型对象的多级(但深度固定)树。 HTML 看起来像这样:
<tr><td rowspan="2">group 1</td><td>item 1.1</td></tr>
<tr><td>item 1.2</td></tr>
<tr><td rowspan="3">group 2</td><td>item 2.1</td></tr>
<tr><td>item 2.2</td></tr>
<tr><td>item 2.3</td></tr>
问题在于填充行跨度。两个级别很容易:您只需使用 group.item_set.count。但是假设我们在项目之后有另一个级别(例如子项目 1.1.1 等):那么“组 1”单元格的行跨度需要是所有项目的计数加上所有项目中所有子项目的总和。使用聚合计算很容易,但我不能在 Django 的模板语言中使用聚合。
这留下了一些选择:
- 将
count_all_subitems方法添加到Group 模型类。但是,仅仅因为视图层需要额外的代码在模型中添加似乎是错误的。 - 在视图函数中生成字典或子项计数列表,并将其作为额外上下文传递;但是,Django 的模板语言不允许字典/列表查找中的键/索引是变量(例如,
subitem_counts.group确实是subitem_counts['group'],并且没有办法使它成为subitem_counts[group]AFAIK),所以这需要自定义过滤器。 - 编写一个自定义过滤器或标签,直接计算和输出子项计数(或整个行跨度值)。
我知道 Django 旨在避免模板中包含太多逻辑,而是建议将其放在视图函数中,但似乎我仍然需要一个额外的部分(自定义模板过滤器或标签)来实际使用结果在模板中。首选的方法是什么?
【问题讨论】:
标签: django tree django-templates html-table