Yanıtlar:
Bunu yapmanın iki yolu var. Doğrudan yaklaşım, şablonunuzdaki strftime () yöntemini çağırmak (ve yazdırmak), örneğin
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Görünürde daha iyi bir yaklaşım, kendi filtrenizi tanımlamak olacaktır, örneğin:
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)
(Bu filtre, i18n ile ilgili nedenlerden dolayı babile dayanmaktadır, ancak strftime'ı da kullanabilirsiniz). Filtrenin avantajı, yazabilmenizdir.
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
ki bu daha hoş görünüyor ve daha sürdürülebilir. Bir diğer yaygın filtre de "8 dakika önce yazılmış" gibi bir şeyi değerlendiren "timedelta" filtresidir. Bunun için kullanabilir babel.dates.format_timedelta
ve burada verilen datetime örneğine benzer bir filtre olarak kaydedebilirsiniz.
datetime
python modülünden bir nesneyi biçimlendirmekle ilgiliydi datetime
, ancak bir struct_time
nesneyi düşük düzeyli time
modülden biçimlendirmeye çalışıyorsunuz . struct_time
nesnelerin bir strftime()
yöntemi yoktur, ancak strftime()
zaman paketinde genel bir yöntem olabilir . Ancak datetime
bunun yerine üst düzey (platformdan bağımsız) paketi kullanmanızı öneririz .
babel.dates.format_datetime(value, format)
İşte Jinja2 ve Flask'ta strftime için kullandığım filtre
@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)
Ve sonra filtreyi şu şekilde kullanırsınız:
{{car.date_of_manufacture|strftime}}
dateutil
ve native
?
Bunun için kendi filtrenizi yazmanız gerektiğini düşünüyorum. Aslında dokümantasyondaki özel filtrelere örnek: http://jinja.pocoo.org/docs/api/#custom-filters
Daha düşük seviyeli bir zaman nesnesiyle uğraşıyorsanız (genellikle tamsayı kullanıyorum) ve herhangi bir nedenle özel bir filtre yazmak istemiyorsanız, kullandığım bir yaklaşım, strftime işlevini şablona bir değişken olarak aktarmaktır. ihtiyacınız olan yerde çağrılabilir.
Örneğin:
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))
Hangi daha sonra içinde kullanılabilir 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>
Herhangi bir filtre olmadan şablonda bu şekilde kullanabilirsiniz
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Google App Engine kullanıcıları: Django'dan Jinja2'ye geçiyorsanız ve tarih filtresini değiştirmek istiyorsanız,% biçimlendirme kodlarının farklı olduğunu unutmayın.
Strftime% kodları burada: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
şişede, babil ile bunu yapmayı seviyorum:
@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'))
şablonda kullanılan {{mydatetimeobject|dt}}
bu yüzden hayır babel ile mesajlarda çeşitli formatınızı belirtebilirsiniz.po örneğin:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Kullanabileceğiniz bir jinja2 uzantısı var, sadece pip kurulumuna ihtiyacınız var ( https://github.com/hackebrot/jinja2-tim )