【问题标题】:Aggregates in Django templatesDjango 模板中的聚合
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 确实,这解决了 3 级案例的问题。谢谢!不过,有没有办法将其应用于 4 个或更多级别?如果我有 Group>Item>Subitem>Subsubitem,我可以注释 Groups,从 Subitems 我可以直接计算 Subsubitem。但是物品呢?我需要制作一个带注释的查询集的字典(对于每个组,它的项目都用子项计数注释),然后我回到第二个项目符号点(必须制作一个自定义过滤器来匹配每个组的注释)项目 qs)。还是我还缺少其他东西?
    • 因为我的层次结构很深(见前面的评论),最后我不得不在模型中添加一个特殊的方法。但是,我接受 mherren 的回答,因为它在许多情况下仍然有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多