Python:如何在Jinja2中设置date?
使用Jinja2,如何格式化date字段? 我知道在Python中,我可以简单地做到这一点:
print car.date_of_manufacture.strftime('%Y-%m-%d')
但是如何在Jinja2中设置date? 谢谢。
有两种方法可以做到这一点。 例如,直接调用(和打印)模板中的strftime()方法
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
另外,更好的方法是定义自己的filter,例如:
from flask import Flask import babel app = Flask(__name__) def format_datetime(value, format='medium'): if format == 'full': format="EEEE, d. MMMM y 'at' HH:mm" elif format == 'medium': format="EE dd.MM.y HH:mm" return babel.dates.format_datetime(value, format) app.jinja_env.filters['datetime'] = format_datetime
(这个filter是基于babel的,因为i18n的原因,但是你也可以使用strftime)。 filter的优点是,你可以写
{{ car.date_of_manufacture|datetime }} {{ car.date_of_manufacture|datetime('full') }}
看起来更好,更可维护。 另一个常见的filter也是“timedelta”filter,其评估类似于“8分钟前写入”。 您可以使用babel.dates.format_timedelta
来注册它,并将其注册为与此处给出的date时间示例类似的filter。
这里是我最终在Jinja2和Flask中使用strftime的filter
@app.template_filter('strftime') def _jinja2_filter_datetime(date, fmt=None): date = dateutil.parser.parse(date) native = date.replace(tzinfo=None) format='%b %d, %Y' return native.strftime(format)
然后你使用这样的filter:
{{car.date_of_manufacture|strftime}}
我想你必须为此编写自己的filter。 这实际上是文档中自定义filter的示例: http : //jinja.pocoo.org/docs/api/#custom-filters
如果你正在处理一个较低级别的时间对象(我通常只是使用整数),并且不想因为任何原因编写一个自定义的filter,我使用的方法是将strftime函数作为variables传递到模板中,它可以被称为你需要它的地方。
例如:
import time context={ 'now':int(time.time()), 'strftime':time.strftime } # Note there are no brackets () after strftime # This means we are passing in a function, # not the result of a function. self.response.write(jinja2.render_template('sometemplate.html', **context))
然后可以在sometemplate.html
:
<html> <body> <p>The time is {{ strftime('%H:%M%:%S',now) }}, and 5 seconds ago it was {{ strftime('%H:%M%:%S',now-5) }}. </body> </html>
Google App Engine用户:如果您正在从Django移动到Jinja2,并且想要replacedatefilter,请注意%格式代码是不同的。
strftime%代码在这里: http : //docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
在烧瓶,与巴贝尔,我喜欢这样做:
@app.template_filter('dt') def _jinja2_filter_datetime(date, fmt=None): if fmt: return date.strftime(fmt) else: return date.strftime(gettext('%%m/%%d/%%Y'))
在{{mydatetimeobject|dt}}
模板中使用
所以没有babel你可以在messages.po中指定你的各种格式,例如:
#: app/views.py:36 #, python-format msgid "%%m/%%d/%%Y" msgstr "%%d/%%m/%%Y"