আমি জিনজা 2-এ কীভাবে একটি তারিখ ফর্ম্যাট করব?


183

জিনজা 2 ব্যবহার করে, আমি কীভাবে তারিখের ক্ষেত্রটি ফর্ম্যাট করব? আমি পাইথনে জানি আমি কেবল এটি করতে পারি:

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

তবে আমি কীভাবে জিনজা 2-তে তারিখটি ফর্ম্যাট করব?

উত্তর:


323

এটি করার দুটি উপায় আছে। সরাসরি দৃষ্টিভঙ্গিটি হ'ল উদাহরণস্বরূপ আপনার টেমপ্লেটে স্ট্রফটাইম () পদ্ধতিটি কল (এবং মুদ্রণ) করা

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

(এই ফিল্টারটি আই 18 এন সম্পর্কিত কারণে বাবেলের উপর ভিত্তি করে তৈরি করা হয়েছে তবে আপনি স্ট্রফটাইমও ব্যবহার করতে পারেন)। ফিল্টারটির সুবিধা হ'ল, আপনি লিখতে পারেন

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

যা দেখতে দেখতে সুন্দর এবং এটি আরও রক্ষণাবেক্ষণযোগ্য। আর একটি সাধারণ ফিল্টার হ'ল "টাইমডেল্টা" ফিল্টার, যা "8 মিনিট আগে লেখা" এর মতো কিছুতে মূল্যায়ন করে। আপনি babel.dates.format_timedeltaএটির জন্য ব্যবহার করতে পারেন এবং এটি এখানে প্রদত্ত তারিখের উদাহরণের মতো ফিল্টার হিসাবে নিবন্ধন করতে পারেন ।


2
তুমি কি আসলেই চেষ্টা করেছ? এটিকে সরাসরি কল করার ফলে ফলাফল পাওয়া যায়: 'টাইম.স্ট্রিক্ট_টাইম অবজেক্ট' এর 'স্ট্রফটাইম' নেই
কার্ল পি

7
আপনার প্রশ্ন অনুসারে, আপনি অন্যরকম কিছু কথা বলছেন। প্রাথমিকভাবে, এই থ্রেডটি datetimeপাইথন মডিউল থেকে কোনও বস্তুর ফর্ম্যাট করার বিষয়ে ছিল datetimeতবে আপনি struct_timeনিম্ন স্তরের timeমডিউল থেকে কোনও বিষয়টিকে বিন্যাস করার চেষ্টা করছেন । struct_timeবস্তুগুলির কোনও strftime()পদ্ধতি নেই, যদিও strftime()টাইম প্যাকেজে কোনও বৈশ্বিক পদ্ধতি থাকতে পারে । তবে আমি আপনাকে datetimeপরিবর্তে উচ্চ স্তরের (প্ল্যাটফর্ম স্বাধীন) প্যাকেজটি ব্যবহার করার পরামর্শ দিচ্ছি ।
tux21b

2
আমি মনে করি আপনার অর্থbabel.dates.format_datetime(value, format)
জনবাইলগুলি

2
একটি নতুন ফিল্টার সংজ্ঞায়িত করা, কোনওভাবেই ভাল নয়। আরও কোড লিখতে = আরও কোড বজায় রাখতে হবে = আরও কোড পার্স করতে হবে, বিট-ক্যাশেড (যদি ব্যবহার করা হয়) এবং ব্যাখ্যা করা হয়। জিনজা 2 ব্যবহারের একটি বড় সুবিধা হ'ল টেমপ্লেটের অভ্যন্তরে ছোট অজগর কোড লেখার দক্ষতা। জ্যাঙ্গোর টেম্পলেট সিস্টেমের তুলনায় পারফরম্যান্সের কয়েকটি লাভ তা থেকে আসে।
স্টিফ্যানচ

4
@ স্টেফাননিচ "একটি নতুন ফিল্টার সংজ্ঞায়িত করা, কোনওভাবেই ভাল নয়"। এটি হতে পারে: যদি ফিল্টারগুলি টেমপ্লেটগুলিতে অনেকবার ডাকা হয় তবে এটি বিন্যাসের স্ট্রিংটি পুনরাবৃত্তি করা এড়িয়ে যায় এবং কম কোড লেখার ফলস্বরূপ হতে পারে। আর আরও গুরুত্বপূর্ণ, কম পুনরাবৃত্তি কোড, একটি abstration যোগ করে।
jacquev6

21

জিনজা 2 এবং ফ্লাস্কে স্ট্রফটাইমের জন্য যে ফিল্টারটি আমি শেষ করেছি তা এখানে

@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

গুগল অ্যাপ ইঞ্জিন ব্যবহারকারীগণ: আপনি যদি জাঙ্গো থেকে জিনজা 2 এ চলে যাচ্ছেন এবং তারিখের ফিল্টারটি প্রতিস্থাপনের জন্য সন্ধান করছেন তবে নোট করুন যে% ফর্ম্যাটিং কোডগুলি আলাদা।

স্ট্রফটাইম% কোডগুলি এখানে রয়েছে: http://docs.python.org/2/library/datetime.html#strftime-and-strptime-behaviour


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

সুতরাং বাবেলের সাথে না আপনি বার্তাগুলিতে আপনার বিভিন্ন বিন্যাস নির্দিষ্ট করতে পারেন can উদাহরণস্বরূপ:

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.