你知道一个自定义标签来增加Django模板中的值吗?

时间:2010-10-13 09:23:05

标签: django templates sum increment accumulate

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

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

我现在必须在视图中执行一次总和,然后重新启动(并再次调用属性)以显示。我可以通过在视图中循环一次并缓存结果来改进它,但后来我获得了更多代码以绕过这些限制,并且我使用更多内存。

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

我最好的办法是写一个模板标签来完成这项工作,但这是一件苦差事:-)你知道有人会这样做吗?

E.G:

理想,它应该是这样的:

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

将显示:

- 2
- 3
- 1
total 6

6 个答案:

答案 0 :(得分:1)

我不知道这是一件苦差事。检查目标变量是否在上下文中,如果不是,则使用列表中第一个元素的类的空构造对象对其进行初始化,然后累积。

答案 1 :(得分:1)

作为计算视图或模板中的和的替代方法,QuerySet.Annotate(total_x = Sum('x'))与数据库如何处理计算呢?

除此之外:我认为,在没有明显答案的情况下,尝试解决实际问题有时会保证不回答直接问题。

答案 2 :(得分: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 %}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

研究像Mako这样的模板系统。 Mako特别允许在模板中运行完整的python代码。

答案 5 :(得分:0)

你有没有令人信服的理由在视图中没有这样做?

比什么更容易:

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

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

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

幸运的是,this is very easy

更新

  

正如我在问题中所说的那样   触发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)

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