variable sort last jinja for comment python jinja2

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.



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>



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"