jinja2中括号的四舍五入

14 投票
3 回答
26840 浏览
提问于 2025-04-17 03:48

我想知道在jinja2的括号里可以进行哪些操作。比如说,我想对嵌入的数据进行一些操作,像这样:

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

这样做会报错,错误信息是:

UndefinedError: 'round' is undefined

同样,当我在jinja的括号里使用'abs'时,也会出现未定义的错误——尽管这两个都是标准库里的函数。有没有办法在模板渲染的时候进行这些操作,而不是在传递数据之前就处理好?

3 个回答

-1

如果你真的需要使用括号的写法,可以把需要的函数作为渲染参数传递。

比如,这段小代码:

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
4

根据Jinja文档,[round]

{{ 42.55|round }}

这个函数会返回一个float类型的数字,所以结果会是43.0。如果你想指定小数位数,可以使用:

{{ 42.55321|round(2) }}

这样会返回42.55,你还可以选择不同的舍入方法,比如round(2, 'ceil')

在进行一些数学运算时,可以把它放在括号里,比如:

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

jinja2模板语言和python语言是不同的。在jinja2中,通常通过过滤器对值进行操作,写法是:{{ something | operation }}。你可以在jinja2的文档中找到一个过滤器列表

举个例子,如果你想要四舍五入,可以这样做:

{{ 42.55|round }}

这样在网页上就会显示“42”。还有一个abs过滤器也是类似的。

请注意,这些过滤器只能用来在显示之前修改值,也可以用来进行一些计算。不过,计算最好不要在模板里进行。

撰写回答