Réponses:
Il y a deux manières de procéder. L'approche directe serait d'appeler (et d'imprimer) simplement la méthode strftime () dans votre modèle, par exemple
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Une autre approche légèrement meilleure serait de définir votre propre filtre, par exemple:
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)
(Ce filtre est basé sur babel pour des raisons concernant i18n, mais vous pouvez également utiliser strftime). L'avantage du filtre est que vous pouvez écrire
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
qui a l'air plus joli et est plus facile à entretenir. Un autre filtre commun est également le filtre "timedelta", qui évalue quelque chose comme "écrit il y a 8 minutes". Vous pouvez l'utiliser babel.dates.format_timedelta
pour cela et l'enregistrer en tant que filtre similaire à l'exemple datetime donné ici.
datetime
objet à partir du module python datetime
, mais vous essayez de formater un struct_time
objet à partir du time
module de bas niveau . struct_time
les objets n'ont pas de strftime()
méthode, bien qu'il puisse y avoir une strftime()
méthode globale dans le package de temps. Mais je vous recommande d'utiliser le datetime
package de haut niveau (indépendant de la plate-forme) à la place.
babel.dates.format_datetime(value, format)
Voici le filtre que j'ai fini par utiliser pour strftime dans Jinja2 et 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)
Et puis vous utilisez le filtre comme ceci:
{{car.date_of_manufacture|strftime}}
dateutil
et native
?
Je pense que vous devez écrire votre propre filtre pour cela. C'est en fait l'exemple de filtres personnalisés dans la documentation: http://jinja.pocoo.org/docs/api/#custom-filters
Si vous avez affaire à un objet de temps de niveau inférieur (j'utilise souvent simplement des entiers) et que vous ne voulez pas écrire de filtre personnalisé pour une raison quelconque, une approche que j'utilise consiste à passer la fonction strftime dans le modèle en tant que variable, où il peut être appelé là où vous en avez besoin.
Par exemple:
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))
Qui peut ensuite être utilisé dans 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>
Vous pouvez l'utiliser comme ça dans un modèle sans aucun filtre
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Utilisateurs de Google App Engine: si vous passez de Django à Jinja2 et que vous souhaitez remplacer le filtre de date, notez que les codes de mise en forme% sont différents.
Les codes strftime% sont ici: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
en flacon, avec babel, j'aime faire ça:
@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'))
utilisé dans le modèle avec {{mydatetimeobject|dt}}
donc non avec babel vous pouvez spécifier vos différents formats dans messages.po comme ceci par exemple:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Il existe une extension jinja2 que vous pouvez utiliser, il suffit d'installer pip ( https://github.com/hackebrot/jinja2-tim )