2011-01-28 7 views

Répondre

246

Il y a deux façons de le faire. L'approche directe serait d'appeler simplement (et imprimer) la méthode strftime() dans votre modèle, par exemple

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

Une autre approche sightly mieux serait de définir votre propre filtre, par exemple:

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 

(Ce filtre est basé sur babel pour des raisons concernant i18n, mais vous pouvez aussi utiliser strftime). L'avantage du filtre est, que vous pouvez écrire

{{ car.date_of_manufacture|datetime }} 
{{ car.date_of_manufacture|datetime('full') }} 

qui semble plus agréable et est plus maintenable. Un autre filtre commun est également le filtre "timedelta", qui évalue quelque chose comme "écrit il y a 8 minutes". Vous pouvez utiliser babel.dates.format_timedelta pour cela et l'enregistrer en tant que filtre similaire à l'exemple datetime donné ici.

+0

Avez-vous essayé en fait cela? l'appeler directement entraîne: 'temps.objet struct_time 'n'a pas d'attribut' strftime ' –

+6

Selon votre question, vous parlez de quelque chose de différent. Initialement, ce sujet traitait de la mise en forme d'un objet 'datetime' à partir du module python' datetime', mais vous essayez de formater un objet 'struct_time' à partir du module' time' de bas niveau. Les objets 'struct_time' n'ont pas de méthode' strftime() ', bien qu'il puisse y avoir une méthode globale' strftime() 'dans le paquet temporel. Mais je vous recommande d'utiliser à la place le paquet 'datetime' de haut niveau (indépendant de la plate-forme). – tux21b

+0

Correct, j'ai utilisé time.time(), et devrait maintenant considérer si je veux vraiment cela, ou datetime.datetime.today() Merci –

18

est ici le filtre que je 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}} 
+1

Pourquoi 'dateutil' et' native'? – gwg

12

Si vous avez affaire à un objet de temps de niveau inférieur (souvent je viens d'utiliser des entiers), et ne veulent pas d'écrire un filtre personnalisé pour une raison quelconque, une approche J'utilise est de passer la fonction strftime dans le modèle en tant que variable, où il peut être appelé 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> 
0

en flacon, avec babel, j'aime faire ceci:

@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 pas avec babel vous pouvez spécifier vos différents format messages.po comme celui-ci par exemple:

#: app/views.py:36 
#, python-format 
msgid "%%m/%%d/%%Y" 
msgstr "%%d/%%m/%%Y"