Risposte:
Ci sono due modi per farlo. L'approccio diretto sarebbe semplicemente chiamare (e stampare) il metodo strftime () nel modello, ad esempio
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Un altro approccio visivamente migliore sarebbe quello di definire il proprio filtro, ad esempio:
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)
(Questo filtro si basa su babel per motivi riguardanti i18n, ma puoi usare anche strftime). Il vantaggio del filtro è che puoi scrivere
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
che sembra più bello ed è più mantenibile. Un altro filtro comune è anche il filtro "timedelta", che valuta qualcosa come "scritto 8 minuti fa". Puoi usarlo babel.dates.format_timedelta
e registrarlo come filtro simile all'esempio datetime qui fornito.
datetime
oggetto dal modulo Python datetime
, ma stai provando a formattare un struct_time
oggetto dal time
modulo di basso livello . struct_time
gli oggetti non hanno un strftime()
metodo, sebbene strftime()
nel pacchetto temporale potrebbe esserci un metodo globale . Ti consiglio invece di usare il datetime
pacchetto di alto livello (indipendente dalla piattaforma) .
babel.dates.format_datetime(value, format)
Ecco il filtro che ho finito per usare per strftime in Jinja2 e 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)
E quindi usi il filtro in questo modo:
{{car.date_of_manufacture|strftime}}
dateutil
e native
?
Penso che devi scrivere il tuo filtro per quello. In realtà è l'esempio dei filtri personalizzati nella documentazione: http://jinja.pocoo.org/docs/api/#custom-filters
Se hai a che fare con un oggetto temporale di livello inferiore (spesso uso solo numeri interi) e non voglio scrivere un filtro personalizzato per qualsiasi motivo, un approccio che uso è quello di passare la funzione strftime nel modello come variabile, dove può essere chiamato dove ne hai bisogno.
Per esempio:
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))
Che può quindi essere utilizzato all'interno di 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>
Puoi usarlo in questo modo nel modello senza filtri
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Utenti di Google App Engine: se stai passando da Django a Jinja2 e stai cercando di sostituire il filtro data, tieni presente che i codici di formattazione% sono diversi.
I codici% strftime sono qui: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
in pallone, con babele, mi piace fare questo:
@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'))
utilizzato nel modello con {{mydatetimeobject|dt}}
quindi no con babel puoi specificare i tuoi vari formati in message.po come questo per esempio:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
C'è un'estensione jinja2 che puoi usare solo per installare pip ( https://github.com/hackebrot/jinja2-tim )