Avec Jinja2, comment puis-je formater un champ de date ? Je sais qu'en Python, je peux le faire simplement :
print(car.date_of_manufacture.strftime('%Y-%m-%d'))
Mais comment puis-je formater la date dans Jinja2 ?
Avec Jinja2, comment puis-je formater un champ de date ? Je sais qu'en Python, je peux le faire simplement :
print(car.date_of_manufacture.strftime('%Y-%m-%d'))
Mais comment puis-je formater la date dans Jinja2 ?
Il y a deux façons de procéder. L'approche directe consiste à appeler (et à imprimer) la méthode strftime() dans votre modèle, par exemple
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Une autre approche, nettement 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 l'internationalisation, mais vous pouvez aussi utiliser strftime). L'avantage de ce filtre est que vous pouvez écrire
{{ car.date_of_manufacture|format_datetime }}
{{ car.date_of_manufacture|format_datetime('full') }}
ce qui est plus joli et plus facile à maintenir. Un autre filtre courant est également le filtre "timedelta", qui donne quelque chose comme "écrit il y a 8 minutes". Vous pouvez utiliser babel.dates.format_timedelta
pour cela, et l'enregistrer comme filtre similaire à l'exemple de datetime donné ici.
Avez-vous vraiment essayé ? L'appeler directement donne le résultat suivant : time.struct_time object' n'a pas d'attribut 'strftime'.
D'après votre question, vous parlez de quelque chose de différent. Initialement, ce fil de discussion concernait le formatage d'un datetime
du module python datetime
mais vous essayez de formater un struct_time
de l'objet de bas niveau time
module. struct_time
n'ont pas d'objet strftime()
bien qu'il puisse y avoir une méthode globale strftime()
dans le paquet horaire. Mais je vous recommande d'utiliser la méthode de haut niveau (indépendante de la plate-forme). datetime
à la place.
C'est exact, j'ai utilisé time.time(), et je devrais maintenant me demander si je veux vraiment cela, ou bien datetime.datetime.today() Merci.
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 ça :
{{car.date_of_manufacture|strftime}}
Si vous avez affaire à un objet temporel de niveau inférieur (j'utilise souvent des entiers) et que vous ne voulez pas écrire un 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ù elle peut être appelée 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>
Je pense que tu dois écrire ton propre filtre pour ça. C'est en fait l'exemple des filtres personnalisés dans la documentation : http://jinja.pocoo.org/docs/api/#custom-filters
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.