Respuestas:
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__)
@app.template_filter()
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)
(Este filtro se basa 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 se evalúa como "escrito hace 8 minutos". Puede usar babel.dates.format_timedelta
para eso y registrarlo como filtro similar al ejemplo de fecha y hora que se proporciona aquí.
datetime
objeto desde el módulo de Python datetime
, pero está intentando formatear un struct_time
objeto desde el time
módulo de bajo nivel . struct_time
los objetos no tienen un strftime()
método, aunque puede haber un strftime()
método global en el paquete de tiempo. Pero te recomiendo que uses el datetime
paquete de alto nivel (independiente de la plataforma) .
babel.dates.format_datetime(value, format)
Aquí está el filtro que terminé usando durante el tiempo de ejecución 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}}
dateutil
y native
?
Creo que tienes que escribir tu propio filtro para eso. En realidad, es el ejemplo de los filtros personalizados en la documentación: http://jinja.pocoo.org/docs/api/#custom-filters
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 el motivo que sea, 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 dentro de 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>
Puede usarlo así en la plantilla sin ningún filtro
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Usuarios de Google App Engine: si se está mudando de Django a Jinja2 y desea reemplazar el filtro de fecha, tenga en cuenta que los códigos de formato% son diferentes.
Los códigos de% de strftime están aquí: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
en 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 sus diversos formatos en mensajes.po como este, por ejemplo:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Hay una extensión jinja2 que puede usar, solo necesita instalar pip ( https://github.com/hackebrot/jinja2-tim )