如何获得当前的时间在jinja

时间:2015-05-07 15:03:28

标签: jinja2

jinja代码中获取当前日期时间值的方法是什么?

在我的项目中,我需要在网站的右上角以UTC显示当前时间。

5 个答案:

答案 0 :(得分:9)

我喜欢@ assem-chelli的回答。我将在Jinja2模板中演示它。

#!/bin/env python3
import datetime
from jinja2 import Template

template = Template("""
# Generation started on {{ now() }}
... this is the rest of my template...
# Completed generation.
""")

template.globals['now'] = datetime.datetime.utcnow

print(template.render())

输出:

# Generation started on 2017-11-14 15:48:06.507123
... this is the rest of my template...
# Completed generation.

答案 1 :(得分:7)

您应该使用datetime Python库,获取时间并将其作为变量传递给模板:

>>> import datetime
>>> datetime.datetime.utcnow()
'2015-05-15 05:22:17.953439'

答案 2 :(得分:2)

对于想将now标记永久添加回Jinja2的任何人,这里都有一个很好的示例,说明如何将其添加为Jinja扩展名: https://www.webforefront.com/django/useandcreatejinjaextensions.html

这需要在Django网络应用程序内的python脚本中定义一个新的Jinja扩展名,然后将其作为扩展名导入settings.py中。

your_web_app/some_file.py中(我将其与settings.py放在同一目录中):

from jinja2 import lexer, nodes
from jinja2.ext import Extension
from django.utils import timezone
from django.template.defaultfilters import date
from django.conf import settings
from datetime import datetime


class DjangoNow(Extension):
    tags = set(['now'])

    def _now(self, date_format):
        tzinfo = timezone.get_current_timezone() if settings.USE_TZ else None
        formatted = date(datetime.now(tz=tzinfo),date_format)
        return formatted

    def parse(self, parser):
        lineno = next(parser.stream).lineno
        token = parser.stream.expect(lexer.TOKEN_STRING)
        date_format = nodes.Const(token.value)
        call = self.call_method('_now', [date_format], lineno=lineno)
        token = parser.stream.current
        if token.test('name:as'):
            next(parser.stream)
            as_var = parser.stream.expect(lexer.TOKEN_NAME)
            as_var = nodes.Name(as_var.value, 'store', lineno=as_var.lineno)
            return nodes.Assign(as_var, call, lineno=lineno)
        else:
            return nodes.Output([call], lineno=lineno)

然后,在settings.py中,将DjangoNow类添加到extensionsOPTIONS下的TEMPLATES列表中:

TEMPLATES = [
    ...
    { 
        'BACKEND':'django.template.backends.jinja2.Jinja2',
        ...
        'OPTIONS': { 
            ...,
            'extensions': [
                'your-app-name.some-file.DjangoNow',
                ],
        }       
   }
]

然后,您可以像在Django中一样使用now标记,例如:

{% now 'U' %}

答案 3 :(得分:1)

我遇到了同样的问题,但最终找到了jinja2-time

from jinja2 import Environment

env = Environment(extensions=['jinja2_time.TimeExtension'])

# Timezone 'local', default format -> "2015-12-10"
template = env.from_string("{% now 'local' %}")

# Timezone 'utc', explicit format -> "Thu, 10 Dec 2015 15:49:01"
template = env.from_string("{% now 'utc', '%a, %d %b %Y %H:%M:%S' %}")

# Timezone 'Europe/Berlin', explicit format -> "CET +0100"
template = env.from_string("{% now 'Europe/Berlin', '%Z %z' %}")

# Timezone 'utc', explicit format -> "2015"
template = env.from_string("{% now 'utc', '%Y' %}")

template.render()

有关jinja2-time扩展安装的更多信息:

jinja2-time可通过pip从PyPI下载:

$ pip install jinja2-time

它将自动与箭头一起安装jinja2。

答案 4 :(得分:0)

要将当前日期戳添加到使用Jinja2从HTML模板生成的HTML文档中:

#In the HTML template do:
{{ date.strftime('%B %d, %Y') }} <!-- Output format "Month DD, YYYY" -->

(最少)Python代码:

## Tested in Python 3.6.8
import os
import datetime
import jinja2 

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader(os.path.dirname(__file__)),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True)

#When building the values to pass to jinja
self.datapool=dict()
self.datapool['date']= datetime.datetime.now()

template = JINJA_ENVIRONMENT.get_template('./templates/base-html-template.html')
report=template.render(self.datapool)