Respostas:
Existem duas maneiras de fazer isso. A abordagem direta seria simplesmente chamar (e imprimir) o método strftime () no seu modelo, por exemplo
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Outra abordagem bastante melhor seria definir seu próprio filtro, por exemplo:
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)
(Esse filtro é baseado no babel por motivos relacionados ao i18n, mas você também pode usar o strftime). A vantagem do filtro é que você pode escrever
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
que parece melhor e é mais sustentável. Outro filtro comum também é o filtro "timedelta", que avalia algo como "escrito 8 minutos atrás". Você pode usar babel.dates.format_timedelta
para isso e registrá-lo como filtro semelhante ao exemplo de data e hora fornecido aqui.
datetime
objeto do módulo python datetime
, mas você está tentando formatar um struct_time
objeto de baixo níveltime
módulo de . struct_time
objetos não possuem um strftime()
método, embora possa haver um strftime()
método global no pacote de horário. Mas eu recomendo que você use o datetime
pacote de alto nível (independente de plataforma) .
babel.dates.format_datetime(value, format)
Aqui está o filtro que acabei usando para strftime no 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 então você usa o filtro da seguinte maneira:
{{car.date_of_manufacture|strftime}}
dateutil
e native
?
Eu acho que você tem que escrever seu próprio filtro para isso. Na verdade, é o exemplo de filtros personalizados na documentação: http://jinja.pocoo.org/docs/api/#custom-filters
Se você está lidando com um objeto de tempo de nível inferior (geralmente uso números inteiros) e não deseja escrever um filtro personalizado por qualquer motivo, uma abordagem que utilizo é passar a função strftime para o modelo como uma variável, em que pode ser chamado onde você precisar.
Por exemplo:
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 pode ser usado em 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>
Você pode usá-lo desta forma no modelo sem filtros
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Usuários do Google App Engine: se você estiver migrando do Django para o Jinja2 e procurando substituir o filtro de data, observe que os% de códigos de formatação são diferentes.
Os códigos strftime% estão aqui: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
no frasco, com babel, eu gosto de fazer isso:
@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'))
usado no modelo com {{mydatetimeobject|dt}}
então não com babel, você pode especificar seus vários formatos em messages.po como este, por exemplo:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Há uma extensão jinja2 que você pode usar, basta instalar o pip ( https://github.com/hackebrot/jinja2-tim )