Używając Jinja2, jak sformatować pole daty? Wiem, że w Pythonie mogę to zrobić:Python: Jak sformatować datę w Jinja2?
print car.date_of_manufacture.strftime('%Y-%m-%d')
Ale jak sformatować datę w Jinja2? Dzięki.
Używając Jinja2, jak sformatować pole daty? Wiem, że w Pythonie mogę to zrobić:Python: Jak sformatować datę w Jinja2?
print car.date_of_manufacture.strftime('%Y-%m-%d')
Ale jak sformatować datę w Jinja2? Dzięki.
Istnieją dwa sposoby, aby to zrobić. Bezpośrednie podejście byłoby po prostu zadzwonić (i druku) strftime() metoda w szablonie, na przykład
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Innym, sightly lepszym rozwiązaniem byłoby, aby zdefiniować własny filtr, np
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
(Ten filtr jest oparty na Babel z powodów dotyczących i18n, ale możesz również użyć strftime). Zaletą filtra jest to, że można napisać, który wygląda ładniej i jest bardziej łatwy w utrzymaniu. Innym powszechnym filtrem jest również filtr "timedelta", który ocenia coś w stylu "napisane 8 minut temu". Możesz użyć do tego celu wartości babel.dates.format_timedelta
i zarejestrować ją jako filtr podobny do podanego tu przykładu datetime.
Myślę, że musisz napisać do tego swój własny filtr. To rzeczywiście przykładem dla filtrów niestandardowych w dokumentacji: http://jinja.pocoo.org/docs/api/#custom-filters
Oto filtr, że skończyło się na strftime w Jinja2 i kolby
@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)
A następnie użyć filtru tak:
użytkowników{{car.date_of_manufacture|strftime}}
Dlaczego "dateutil" i "natywny"? – gwg
Google App Engine: Jeśli jesteś przechodząc z Django na Jinja2 i chcąc zastąpić filtr daty, zauważ, że% kodów formatowania jest różnych.
strftime% kody są tutaj: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
Jeśli masz do czynienia z obiektem czasu niższy poziom (często wystarczy użyć liczb całkowitych), a nie chce napisać niestandardowy filtr z jakiegokolwiek powodu, podejście Używam, aby przekazać funkcję strftime do szablonu jako zmienną, gdzie można ją nazwać tam, gdzie jej potrzebujesz.
Na przykład:
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))
które następnie mogą być używane wewnątrz 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>
w kolbie z babel, chciałbym to zrobić:
@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'))
stosowane w szablon z {{mydatetimeobject|dt}}
więc żaden z babel można określić różne format w messages.po tak na przykład:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
czy rzeczywiście spróbować? wywołanie go bezpośrednio skutkuje: "czasem.Obiekt struct_time "nie ma atrybutu" strftime " –
Zgodnie z twoim pytaniem mówisz o czymś innym. Początkowo ten wątek dotyczył formatowania obiektu 'datetime' z modułu pythona' datetime', ale próbujesz sformatować obiekt 'struct_time' z modułu' time' niskiego poziomu. Obiekty 'struct_time' nie mają metody' strftime() ', chociaż może istnieć globalna metoda' strftime() 'w pakiecie czasu. Ale polecam zamiast tego używać pakietu 'datetime' wysokiego poziomu (niezależnego od platformy). – tux21b
Prawidłowo, używam time.time() i powinienem teraz rozważyć, czy naprawdę tego chcę, czy datetime.datetime.today() Dzięki –