python-3.x 如何使用Jinja2对模板类型执行算术运算?

x33g5p2x  于 2023-01-14  发布在  Python
关注(0)|答案(1)|浏览(128)

我尝试使用Jinja2对模板化的datetime值执行算术运算。Perform arithmetic operation in Jinja2,我看到Jinja2支持对模板类型执行算术运算。
我想把它扩展到datetime
我试着这么做:

from jinja2 import Template
import datetime
template = Template("Date: {{ currentDate +2  }}")
template.render(currentDate=datetime.datetime.today())

但它抛出以下内容:

TypeError: unsupported operand type(s) for +: 'datetime.datetime' and 'int'

我试着想出一个解决方案,我可以分配一个函数,当调用它时,返回自纪元以来的天数,但我仍然需要能够将该值表示为有效日期。
如何使用Jinja2实现这一点?

vojdkbi0

vojdkbi01#

由于您的目标是将两天添加到另一个日期,因此可以将datetime模块传递给模板,然后使用其timedelta()方法:
给定:

from jinja2 import Template
import datetime

template = Template("""
Date:        {{ currentDate }}
In two days: {{ currentDate + datetime.timedelta(days=2) }}
""")
print(
    template.render(
        currentDate=datetime.datetime.today(), 
        datetime=datetime
    )
)

这将产生:

Date:        2023-01-10 19:52:50.276999
In two days: 2023-01-12 19:52:50.276999

您甚至可以将代码进一步简化为

from jinja2 import Template
import datetime

template = Template("""
Date:        {{ datetime.datetime.today() }}
In two days: {{ datetime.datetime.today() + datetime.timedelta(days=2) }}
""")
print(
    template.render(datetime=datetime)
)

但是请记住,模板系统是用来显示的,您应该避免在模板中执行过多的逻辑操作。
因此,您必须在模板中可接受的逻辑量和不可接受的逻辑量之间划出一条界线。
例如,在MVC中,您可能更愿意执行以下操作:

from jinja2 import Template
import datetime

now = datetime.datetime.today()
template = Template("""
Date:        {{ now }}
In two days: {{ in_two_days }}
""")
print(
    template.render(
        now=now,
        in_two_days=now + datetime.timedelta(days=2)
    )
)

相关问题