मैं जिंजा 2 में एक तारीख कैसे प्रारूपित करूं?


183

Jinja2 का उपयोग करते हुए, मैं एक दिनांक फ़ील्ड को कैसे प्रारूपित करूँ? मुझे पता है कि पायथन में मैं बस यही कर सकता हूं:

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

लेकिन मैं जिंजा 2 में तारीख को कैसे प्रारूपित करूं?

जवाबों:


326

इसे करने के दो तरीके हैं। प्रत्यक्ष दृष्टिकोण उदाहरण के लिए, अपने टेम्पलेट में स्ट्रैफ़ाइम () विधि को केवल कॉल करना (और प्रिंट करना) होगा

{{ 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)

(यह फिल्टर i18n से संबंधित कारणों के लिए बेबल पर आधारित है, लेकिन आप स्ट्रैप्टाइम का भी उपयोग कर सकते हैं)। फ़िल्टर का लाभ यह है, कि आप लिख सकते हैं

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

जो अच्छा लग रहा है और अधिक बनाए रखने योग्य है। एक और आम फिल्टर "टाइमडेल्टा" फिल्टर भी है, जो "8 मिनट पहले लिखे" जैसे कुछ का मूल्यांकन करता है। आप इसके लिए उपयोग कर सकते हैं babel.dates.format_timedelta, और इसे दिए गए डेटाइम उदाहरण के समान फ़िल्टर के रूप में पंजीकृत कर सकते हैं।


2
क्या आपने वास्तव में कोशिश की थी? इसे सीधे कॉल करने पर: 'time.struct_time ऑब्जेक्ट' की कोई विशेषता 'स्ट्रैटिफ़ाइम' नहीं है
कार्ल पी।

7
आपके सवाल के अनुसार, आप कुछ अलग बात कर रहे हैं। प्रारंभ में, यह धागा datetimeअजगर मॉड्यूल से किसी ऑब्जेक्ट को स्वरूपित करने के बारे में था datetime, लेकिन आप struct_timeनिम्न स्तर के timeमॉड्यूल से ऑब्जेक्ट को प्रारूपित करने का प्रयास कर रहे हैं । struct_timeऑब्जेक्ट में एक strftime()विधि नहीं होती है , हालांकि strftime()समय पैकेज में एक वैश्विक विधि हो सकती है । लेकिन मैं आपको datetimeइसके बजाय उच्च स्तर (प्लेटफ़ॉर्म स्वतंत्र) पैकेज का उपयोग करने की सलाह देता हूं ।
tux21b

2
मुझे लगता है कि आपका मतलब हैbabel.dates.format_datetime(value, format)
जॉनबोइल्स

2
एक नया फ़िल्टर परिभाषित करना, किसी भी तरह से बेहतर नहीं है। लिखने के लिए अधिक कोड = बनाए रखने के लिए अधिक कोड = पार्स किए जाने के लिए अधिक कोड, बिट-कैश्ड (यदि उपयोग किया जाता है) और व्याख्या की गई। जिनजा 2 का उपयोग करने के बड़े लाभों में से एक टेम्पलेट के अंदर छोटे अजगर कोड लिखने की क्षमता है। Django के टेम्पलेट सिस्टम की तुलना में कुछ प्रदर्शन लाभ, उसी से आता है।
स्टीफन नच

4
@StefanNch "एक नया फ़िल्टर परिभाषित करना, किसी भी तरह से बेहतर नहीं है"। यह हो सकता है: यदि फ़िल्टर को कई बार टेम्प्लेट्स में कहा जाता है, तो यह प्रारूप स्ट्रिंग को दोहराने से बचता है, और इसके परिणामस्वरूप कम कोड लेखन हो सकता है। और भी अधिक महत्वपूर्ण, कम दोहराया कोड, एक प्रदर्शन जोड़कर।
जेकव्यू

21

यहाँ फिल्टर है कि मैं Jinja2 और फ्लास्क में strftime का उपयोग कर समाप्त हो गया

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

2
क्यों कर रहे हैं dateutilऔर native?
gwg


15

यदि आप एक निम्न स्तर समय वस्तु (मैं अक्सर पूर्णांक का उपयोग करते हैं) के साथ काम कर रहे हैं, और जो भी कारण के लिए एक कस्टम फ़िल्टर लिखना नहीं चाहते हैं, मैं जिस दृष्टिकोण का उपयोग करता हूं वह स्ट्रैफ़ाइम फ़ंक्शन को एक चर के रूप में टेम्पलेट में पास करना है, जहां यह कहा जा सकता है जहाँ आपको इसकी आवश्यकता है।

उदाहरण के लिए:

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>


4

Google App Engine उपयोगकर्ता: यदि आप Django से Jinja2 की ओर बढ़ रहे हैं, और दिनांक फ़िल्टर को बदलने के लिए देख रहे हैं, तो ध्यान दें कि% स्वरूपण कोड भिन्न हैं।

स्ट्रैप्टाइम% कोड यहाँ हैं: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior


0

फ्लास्क में, बैबल के साथ, मुझे यह करना पसंद है:

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

उदाहरण के लिए आप इस तरह से मेसेज में अपना विभिन्न प्रारूप निर्दिष्ट कर सकते हैं।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.