Django模板中的聚合

时间:2009-09-25 15:18:29

标签: django tree django-templates html-table

在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.groupsubitem_counts['group'],并且没有办法让它subitem_counts[group] AFAIK),因此需要自定义过滤器。
  • 编写自定义过滤器或标记,直接计算和输出子项目数(或整个行数值)。

我知道Django的目的是避免模板中有太多逻辑,而是建议将它放在视图函数中,但似乎我还需要一个额外的部分(自定义模板过滤器或标签)来实际使用结果在模板中。什么是首选方法?

1 个答案:

答案 0 :(得分:0)

在视图中,您可以使用聚合“annotate”方法将subitem_count值添加到传递给视图的Group模型查询集,而不修改实际的模型定义。

一个基本的例子包含在this SO问题的答案中。