ใช้ Jinja2 ฉันจะจัดรูปแบบเขตข้อมูลวันที่ได้อย่างไร ฉันรู้ใน Python ฉันสามารถทำสิ่งนี้:
print(car.date_of_manufacture.strftime('%Y-%m-%d'))
แต่ฉันจะจัดรูปแบบวันที่ใน Jinja2 ได้อย่างไร
ใช้ Jinja2 ฉันจะจัดรูปแบบเขตข้อมูลวันที่ได้อย่างไร ฉันรู้ใน Python ฉันสามารถทำสิ่งนี้:
print(car.date_of_manufacture.strftime('%Y-%m-%d'))
แต่ฉันจะจัดรูปแบบวันที่ใน Jinja2 ได้อย่างไร
คำตอบ:
มีสองวิธีในการทำ วิธีการโดยตรงคือการเรียก (และพิมพ์) วิธี strftime () ในแม่แบบของคุณ
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
แนวทางอื่นที่ดีกว่าคือการกำหนดตัวกรองของคุณเองเช่น:
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)
(ตัวกรองนี้อ้างอิง Babel ด้วยเหตุผลเกี่ยวกับ i18n แต่คุณสามารถใช้ strftime ได้เช่นกัน) ข้อดีของตัวกรองคือคุณสามารถเขียนได้
{{ car.date_of_manufacture|datetime }}
{{ car.date_of_manufacture|datetime('full') }}
ซึ่งดูดีกว่าและบำรุงรักษาได้มากกว่า ตัวกรองทั่วไปอีกอย่างก็คือตัวกรอง "timedelta" ซึ่งประเมินเป็นบางสิ่งเช่น "เขียนเมื่อ 8 นาทีที่แล้ว" คุณสามารถใช้babel.dates.format_timedelta
สิ่งนั้นและลงทะเบียนเป็นตัวกรองที่คล้ายกับตัวอย่างวันที่และเวลาที่ให้ไว้ที่นี่
datetime
วัตถุจากโมดูลหลามdatetime
แต่คุณพยายามจัดรูปแบบstruct_time
วัตถุจากtime
โมดูลระดับต่ำ struct_time
วัตถุไม่มีstrftime()
วิธีแม้ว่าอาจจะมีstrftime()
วิธีการทั่วโลกในแพ็คเกจเวลา แต่ฉันขอแนะนำให้คุณใช้datetime
แพ็คเกจระดับสูง (แพลตฟอร์มอิสระ) แทน
babel.dates.format_datetime(value, format)
นี่คือตัวกรองที่ฉันใช้เป็น strftime ใน Jinja2 และ 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)
จากนั้นคุณใช้ตัวกรองดังนี้:
{{car.date_of_manufacture|strftime}}
dateutil
และnative
?
ฉันคิดว่าคุณต้องเขียนตัวกรองของคุณเองสำหรับสิ่งนั้น จริงๆแล้วมันเป็นตัวอย่างสำหรับตัวกรองที่กำหนดเองในเอกสาร: http://jinja.pocoo.org/docs/api/#custom-filters
หากคุณกำลังจัดการกับวัตถุเวลาระดับต่ำกว่า (ฉันมักจะใช้จำนวนเต็ม) และไม่ต้องการเขียนตัวกรองแบบกำหนดเองไม่ว่าด้วยเหตุผลใดก็ตามวิธีที่ฉันใช้คือการส่งฟังก์ชัน strftime ไปยังแม่แบบเป็นตัวแปรโดยที่ มันสามารถเรียกว่าที่คุณต้องการ
ตัวอย่างเช่น:
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))
ซึ่งสามารถใช้ภายใน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>
คุณสามารถใช้มันในเทมเพลตโดยไม่มีตัวกรองใด ๆ
{{ car.date_of_manufacture.strftime('%Y-%m-%d') }}
ผู้ใช้ Google App Engine: หากคุณย้ายจาก Django เป็น Jinja2 และต้องการเปลี่ยนตัวกรองวันที่โปรดทราบว่ารหัสการจัดรูปแบบ% แตกต่างกัน
โค้ด% strftime อยู่ที่นี่: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
ในกระติกน้ำกับบาเบลฉันชอบทำสิ่งนี้:
@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'))
ใช้ในเทมเพลตด้วย {{mydatetimeobject|dt}}
ดังนั้นไม่มี babel คุณสามารถระบุรูปแบบต่าง ๆ ของคุณใน Messages.po เช่นนี้:
#: app/views.py:36
#, python-format
msgid "%%m/%%d/%%Y"
msgstr "%%d/%%m/%%Y"
มีนามสกุล jinja2 ที่คุณสามารถใช้เพียงแค่ติดตั้ง pip ( https://github.com/hackebrot/jinja2-tim )