Antworten:
Es gibt zwei Möglichkeiten, dies zu tun. Der direkte Ansatz wäre beispielsweise, einfach die strftime () -Methode in Ihrer Vorlage aufzurufen (und zu drucken)
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Ein anderer, deutlich besserer Ansatz wäre, einen eigenen Filter zu definieren, z.
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)
(Dieser Filter basiert aus Gründen in Bezug auf i18n auf babel, aber Sie können auch strftime verwenden). Der Vorteil des Filters ist, dass Sie schreiben können
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
Das sieht besser aus und ist wartbarer. Ein weiterer gebräuchlicher Filter ist auch der "timedelta" -Filter, der so etwas wie "vor 8 Minuten geschrieben" ergibt. Sie können dies verwenden babel.dates.format_timedelta
und als Filter registrieren, ähnlich dem hier angegebenen Datum / Uhrzeit-Beispiel.
datetime
Objekts aus dem Python-Modul datetime
, aber Sie versuchen, ein struct_time
Objekt aus dem Low-Level- time
Modul zu formatieren . struct_time
Objekte haben keine strftime()
Methode, obwohl das Zeitpaket möglicherweise eine globale strftime()
Methode enthält. Ich empfehle Ihnen jedoch, datetime
stattdessen das High-Level- Paket (plattformunabhängig) zu verwenden.
babel.dates.format_datetime(value, format)
Hier ist der Filter, den ich für strftime in Jinja2 und Flask verwendet habe
@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)
Und dann benutzt du den Filter so:
{{car.date_of_manufacture|strftime}}
dateutil
und native
?
Ich denke, Sie müssen Ihren eigenen Filter dafür schreiben. Dies ist das Beispiel für benutzerdefinierte Filter in der Dokumentation: http://jinja.pocoo.org/docs/api/#custom-filters
Wenn Sie mit einem Zeitobjekt niedrigerer Ebene arbeiten (ich verwende oft nur Ganzzahlen) und aus irgendeinem Grund keinen benutzerdefinierten Filter schreiben möchten, übergebe ich die strftime-Funktion als Variable an die Vorlage Es kann dort aufgerufen werden, wo Sie es brauchen.
Beispielsweise:
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))
Welches kann dann verwendet werden in 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>
Sie können es so in der Vorlage ohne Filter verwenden
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Nutzer der Google App Engine: Wenn Sie von Django zu Jinja2 wechseln und den Datumsfilter ersetzen möchten, beachten Sie, dass die% -Formatierungscodes unterschiedlich sind.
Die strftime% -Codes finden Sie hier: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
In einer Flasche mit Babel mache ich das gerne:
@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'))
in der Vorlage mit verwendet {{mydatetimeobject|dt}}
Also nein, mit Babel können Sie Ihre verschiedenen Formate in messages.po wie folgt angeben:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Es gibt eine jinja2-Erweiterung, die Sie verwenden können. Sie benötigen lediglich eine Pip-Installation ( https://github.com/hackebrot/jinja2-tim ).