sort - Python: ¿cómo formateo una fecha en Jinja2?
jinja2 sort filter (6)
Aquí está el filtro que terminé usando para strftime en Jinja2 y Flask
@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)
Y luego usas el filtro así:
{{car.date_of_manufacture|strftime}}
Usando Jinja2, ¿cómo formateo un campo de fecha? Sé que en Python puedo simplemente hacer esto:
print car.date_of_manufacture.strftime(''%Y-%m-%d'')
¿Pero cómo formateo la fecha en Jinja2? Gracias.
Creo que tienes que escribir tu propio filtro para eso. En realidad, es el ejemplo de filtros personalizados en la documentación: http://jinja.pocoo.org/docs/api/#custom-filters
Hay dos maneras de hacerlo. El enfoque directo sería simplemente llamar (e imprimir) el método strftime () en su plantilla, por ejemplo
{{ car.date_of_manufacture.strftime(''%Y-%m-%d'') }}
Otro enfoque, visualmente mejor, sería definir su propio filtro, por ejemplo:
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
(Este filtro está basado en Babel por razones relacionadas con i18n, pero también puede usar strftime). La ventaja del filtro es que puedes escribir
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime(''full'') }}
que se ve mejor y es más fácil de mantener. Otro filtro común es también el filtro "timedelta", que evalúa algo así como "escrito hace 8 minutos". Puede usar babel.dates.format_timedelta
para eso y registrarlo como un filtro similar al ejemplo de fecha y hora dado aquí.
Si se trata de un objeto de tiempo de nivel inferior (a menudo solo uso números enteros), y no quiero escribir un filtro personalizado por cualquier razón, un enfoque que uso es pasar la función strftime a la plantilla como una variable, donde se puede llamar donde lo necesite.
Por ejemplo:
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))
Que luego se puede usar en 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>
Usuarios de Google App Engine: si te estás moviendo de Django a Jinja2 y estás buscando reemplazar el filtro de fecha, ten en cuenta que los códigos de formato% son diferentes.
Los códigos strftime% están aquí: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
en un matraz, con babel, me gusta hacer esto:
@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''))
utilizado en la plantilla con {{mydatetimeobject|dt}}
así que no con Babel puede especificar su formato en messages.po como este, por ejemplo:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"