严格MVC的一个非常烦人的事情是你可以在模板中进行最小的处理。虽然这通常是一种很好的做法,但在这种情况下它会妨碍:
我现在必须在视图中执行一次总和,然后重新启动(并再次调用属性)以显示。我可以通过在视图中循环一次并缓存结果来改进它,但后来我获得了更多代码以绕过这些限制,并且我使用更多内存。
在项目的这个阶段,这不是什么大不了的事。性能根本不是问题。但我真的很想知道是否有解决方案。
我最好的办法是写一个模板标签来完成这项工作,但这是一件苦差事:-)你知道有人会这样做吗?
E.G:
理想,它应该是这样的:
{% for object in object_list %}
- {% sum_in_and_print object.property total %}
{% endfor %}
total {{ total }}
将显示:
- 2
- 3
- 1
total 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)
您在视图中处理一次,然后当您在模板中输出它时,它就是一本字典,字典中的所有内容都已处理完毕。