【问题标题】:Rounding in jinja2 bracketsjinja2 括号中的舍入
【发布时间】:2011-10-06 14:19:53
【问题描述】:

我想一般来说我很好奇 jinja2 括号中允许哪些操作,例如我想要做的是像这样对嵌入式数据执行操作:

{{ round(255*(mileage['chevy'] - mileage['ford']))/1000 }}

这会在回溯中引发错误:

UndefinedError: 'round' 未定义

类似地,当我尝试在带括号的 jinja 块中使用“abs”时,我得到一个未定义的错误——即使它们都是标准的 lib 函数。有没有办法在模板渲染期间执行此操作,而不是在传递数据之前?

【问题讨论】:

  • 一般来说,您希望在您的程序代码中进行计算,而不是在您的模板中。我不确定你认为 Jinja2 的括号有什么作用,但它们没有允许你在模板中嵌入 python 代码。

标签: python templates jinja2


【解决方案1】:

jinja2 模板语言不同于 python 语言。在 jinja2 中,对值的操作通常在过滤器期间完成:{{ something | operation }}。您可以在 jinja2 文档中找到list of filters

例如,给round,你可以这样做:

{{ 42.55|round }}

这将在网页上显示“42”。 abs 过滤器以相同的方式存在。

请注意,这些过滤器只能用于在显示之前更改值,并且可以用于计算。无论如何都不应该在模板中进行计算。

【讨论】:

  • +1。除此之外,可用的对象和函数是通过context 注入的,默认情况下只包含一些特殊项目。
  • 谢谢,我开始使用 python 模板库,认为它就像 PHP 或 Java 服务器页面。这回答了我的问题。
  • "无论如何都不应该在模板中进行计算。"
  • 好吧,如果显示列所需的转换是不平凡的,它们实际上是不同的数字,不同的数据。向模板提供数据是控制器/视图(取决于您如何调用它)的角色。
  • 但是,如果转换很简单(例如,为了显示百分比,将部分值除以总值),在控制器中执行此操作是浪费性的膨胀,应该明智地出现在视图中。
【解决方案2】:

根据 Jinja Docs [round]

{{ 42.55|round }}

将返回float,因此结果将为43.0。如果需要指定精度使用:

{{ 42.55321|round(2) }}

会返回42.55,你也可以选择取整的方法,例如。 round(2, 'ceil')

在执行一些数学运算时,也将其放入括号中,例如:

{{ (x*y/z)|round(2) }}

【讨论】:

  • 如果你想去掉尾部的.0,可以调用{{ 42.55 | round | int }}
【解决方案3】:

如果确实需要使用括号样式,可以将需要的函数作为渲染参数传递。

比如这个小代码:

from jinja2 import Environment, BaseLoader

mytemplate = '{{ round(3.7) }}'
result = Environment(loader=BaseLoader).from_string(mytemplate).render(round=round)
print(result)

打印:

4

你也可以从一个模块中传递所有的函数:

from jinja2 import Environment, BaseLoader
import math
from inspect import getmembers

mytemplate = '{{ fabs(sin(-pi/3)) }}'
result = Environment(loader=BaseLoader).from_string(mytemplate).render(getmembers(math))
print(result)

哪个打印:

0.8660254037844386

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多