224 votes

Comment formater une 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 ?

389voto

tux21b Points 17336

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.

4 votes

Avez-vous vraiment essayé ? L'appeler directement donne le résultat suivant : time.struct_time object' n'a pas d'attribut 'strftime'.

7 votes

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.

0 votes

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.

27voto

Raj Points 955

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}}

2 votes

Pourquoi les dateutil y native ?

18voto

Olly F-G Points 407

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>

18voto

Brian Goldman Points 531

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

15voto

Zaytsev Dmitry Points 548

Vous pouvez l'utiliser comme ceci dans le modèle sans aucun filtre

{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}

Prograide.com

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.

Powered by:

X