0

严格 MVC 的一件非常烦人的事情是您可以在模板中进行最小的处理。虽然这通常是一个很好的做法,但在这种情况下,它会妨碍:

  • 我在很多对象的查询集上创建了一个 for 循环并显示一些属性;
  • 属性是属性,进行繁重的处理(我不想触发它们两次)。
  • 最后我需要显示这些属性的总值。

我现在必须在视图中求和一次,然后重新循环(并再次调用属性)以显示。我可以通过在视图中循环一次并缓存结果来改进它,但是我得到更多的代码只是为了绕过这个限制,并且我使用了更多的内存。

在项目的这个阶段,这没什么大不了的。性能根本不是问题。但我真的很想知道是否有解决方案。

我最好的选择是编写一个模板标签来完成这项工作,但这太麻烦了:-) 你知道有人已经这样做了吗?

例如:

理想情况下,它应该是这样的:

{% for object in object_list %}
    - {% sum_in_and_print object.property total %}
{% endfor %}
total {{ total }}

这将显示:

- 2
- 3
- 1
total 6
4

6 回答 6

1

我不明白这是怎么回事。检查目标变量是否在上下文中,如果没有,则使用列表中第一个元素的类的空构造对象对其进行初始化,然后进行累加。

于 2010-10-13T13:33:14.537 回答
1

作为在视图或模板中计算总和的替代方法,QuerySet.Annotate(total_x=Sum('x')) 怎么样,让数据库负责计算?

旁白:我相信尝试解决实际问题有时需要在没有明显答案的情况下不回答直接问题。

于 2010-10-13T21:16:18.900 回答
0

研究一个不同的模板系统,比如 Mako。Mako 特别允许在模板中运行完整的 python 代码。

于 2010-10-13T13:20:12.573 回答
0

我不知道你正在开发什么项目,但如果你已经要求用户拥有 JavaScript,你可以检查 jQuery.calculation 插件。这是将所有愚蠢的计算转移到客户端的好工具。

于 2010-10-13T13:14:37.407 回答
0

您在视图中不这样做是否有令人信服的理由?

有什么比这更容易的:

total = sum([o.property for o in object_list])

即使您的目标是使用泛型,您也可以始终将其包装在视图函数中。

让我补充一点,我认为您特别想要的功能:输出变量并将其添加到某个任意变量 - 是如此独特的功能,您绝对想为它编写自己的模板标签。

幸运的是,这很容易

更新

正如我在问题中所说,属性触发 HEAVY 处理。我不想触发它们两次...

所以你可以试试这个:

rendered_object_list = []
for o in object_list:
    rendered_object_list.append({
        'field1': o.field1,
        'field2': o.field2,
        'property': o.property
    })
total = sum(o['property'] for o in rendered_object_list)

您在视图中处理一次,然后在模板中输出它时,它是一个字典,字典中的所有内容都已处理。

于 2010-10-13T15:51:48.647 回答
0

我很难写好标签。如果评估顺序正常,您必须小心(总和可能显示在数据上方)。你可以有很多总结部分(也可能是数据)。您可能需要以下结构:

{% raport %}
    {% sumup %}
        ...
    {% endsumup %}
    {% data %}
        ...
    {% enddata %}
    {% sumup %}
        ...
    {% endsumup %}
{% endraport %}

编辑: 您也将很难解析多级结构:

{% raport %}
    {% sumup %}
        ...
    {% endsumup %}
    {% data %}
        {% raport %}
            {% sumup %}
                ...
            {% endsumup %}
            {% data %}
                ...
            {% enddata %}
            {% sumup %}
                ...
            {% endsumup %}
        {% endraport %}
    {% enddata %}
    {% sumup %}
        ...
    {% endsumup %}
{% endraport %}
于 2010-10-13T10:14:37.947 回答