Django - 模板中的复杂计算

Posted

技术标签:

【中文标题】Django - 模板中的复杂计算【英文标题】:Django - complex calculations in the template 【发布时间】:2016-11-07 18:53:22 【问题描述】:

据我了解,没有办法在模板中包含 django 变量进行数学运算,例如

<td>variable_1 + variable_2</td>

人们建议在视图中进行计算,但我担心我们应该使用服务器端来将数据从服务器传输到客户端——仅此而已。所有计算都应使用客户端计算机电源完成。另一种选择可能是在页面加载后在 javascript(尤其是 jquery)中进行计算,但缺点是在计算非常复杂的情况下,数据呈现滞后。这里的最佳实践和最平衡的解决方案是什么?

【问题讨论】:

VTC 主要基于意见。在我看来,您认为这应该发生在客户端和/或模板中。没事儿。 Django 强烈认为不应该这样做,因为他们围绕这种观点构建了框架,并故意在模板中限制了此类用途。作为旁注,您自己似乎对此感到矛盾,因为一开始您说它应该是客户端,然后担心由于在客户端执行它而导致的渲染延迟。 好吧,我担心客户端延迟渲染,因为我在页面加载后进行计算,否则你怎么能循环遍历表格 这有很大的错误。在模板中进行计算不会占用客户端的处理能力。它只是将它转移到框架中的另一个点,但我们仍然在服务器端。这看起来像是一个为了问而问的问题。如果没有,请考虑角度。我怀疑在绝大多数应用程序中,模板中会有这么多重要的计算。 Wtower 的评论需要多次投票。如果 OP 认为模板是在客户端呈现的,那么他对 Django 有一个根本性的误解。 【参考方案1】:

django-mathfilters 专门为此目的提供了一系列模板标签。安装后,您将能够通过过滤标签在模板中执行有限的计算。来自文档:

% load mathfilters %

<h1>Basic math filters</h1>

<ul>
    <li>8 + 3 =  8|add:3 </li>

    <li>13 - 17 =  13|sub:17 </li>

    % with answer=42 %
    <li>42 * 0.5 =  answer|mul:0.5 </li>
    % endwith %

    % with numerator=12 denominator=3 %
    <li>12 / 3 =  numerator|div:denominator </li>
    % endwith %

    <li>|-13| =  -13|abs </li>
</ul>

如果您需要更多功能,您可以轻松地make your own tags 执行任何需要的计算。

【讨论】:

另外,@Wtower 上面的评论很重要,也是一个基本概念;模板渲染不是客户端操作。

以上是关于Django - 模板中的复杂计算的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jinja2 模板 Django 中计算循环“for in”中的所有元素

django:如何在模板 html 页面内进行计算?

如何在 Django 中按计算字段复杂排序?

对 Django 数据库值执行计算:views.py、模板还是 Javascript?

将fme的模板作为web端的后台计算模型,django实现模板集成

Vue中的计算属性