Jawaban:
Ada dua cara untuk melakukannya. Pendekatan langsung adalah dengan memanggil (dan mencetak) metode strftime () dalam template Anda, misalnya
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Lain, pendekatan yang jauh lebih baik adalah dengan mendefinisikan filter Anda sendiri, misalnya:
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)
(Filter ini didasarkan pada babel karena alasan mengenai i18n, tetapi Anda juga dapat menggunakan strftime). Keuntungan dari filter ini adalah, Anda dapat menulis
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
yang terlihat lebih bagus dan lebih mudah dikelola. Filter umum lainnya juga adalah filter "timedelta", yang mengevaluasi ke sesuatu seperti "ditulis 8 menit yang lalu". Anda dapat menggunakannya babel.dates.format_timedelta
untuk itu, dan mendaftarkannya sebagai filter yang mirip dengan contoh waktu yang diberikan di sini.
datetime
objek dari modul python datetime
, tetapi Anda mencoba memformat struct_time
objek dari time
modul tingkat rendah . struct_time
objek tidak memiliki strftime()
metode, walaupun mungkin ada strftime()
metode global dalam paket waktu. Tetapi saya menyarankan Anda untuk menggunakan paket tingkat tinggi (platform independen) datetime
sebagai gantinya.
babel.dates.format_datetime(value, format)
Inilah filter yang akhirnya saya gunakan untuk strftime di Jinja2 dan 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)
Dan kemudian Anda menggunakan filter seperti ini:
{{car.date_of_manufacture|strftime}}
dateutil
dan native
?
Saya pikir Anda harus menulis filter sendiri untuk itu. Ini sebenarnya contoh untuk filter khusus dalam dokumentasi: http://jinja.pocoo.org/docs/api/#custom-filters
Jika Anda berurusan dengan objek waktu level yang lebih rendah (saya sering hanya menggunakan bilangan bulat), dan tidak ingin menulis filter khusus untuk alasan apa pun, pendekatan yang saya gunakan adalah meneruskan fungsi strftime ke template sebagai variabel, di mana itu bisa disebut di mana Anda membutuhkannya.
Sebagai contoh:
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))
Yang kemudian dapat digunakan dalam 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>
Anda dapat menggunakannya seperti ini di template tanpa filter
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
Pengguna Google App Engine: Jika Anda pindah dari Django ke Jinja2, dan ingin mengganti filter tanggal, perhatikan bahwa% kode pemformatan berbeda.
Kode strftime% ada di sini: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
dalam labu, dengan babel, saya suka melakukan ini:
@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'))
digunakan dalam templat dengan {{mydatetimeobject|dt}}
jadi tidak dengan babel Anda dapat menentukan berbagai format Anda di messages.po seperti ini misalnya:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
Ada ekstensi jinja2 yang dapat Anda gunakan hanya perlu instal pip ( https://github.com/hackebrot/jinja2-tim )