Django

2010-09-26 7 views
33

में तिथियों की तुलना कैसे करें मैं टेम्पलेट में अधिमानतः, Django में वर्तमान दिनांक की तारीख की तुलना करना चाहता हूं, लेकिन टेम्पलेट को प्रस्तुत करने से पहले भी करना संभव है। यदि तिथि पहले से ही पारित हो चुकी है, तो मैं "अतीत में" कहना चाहता हूं, जबकि भविष्य में यह है, तो मैं तारीख देना चाहता हूं।Django

मुझे उम्मीद थी एक कुछ इस तरह कर सकता है:

{% if listing.date <= now %} 
    In the past 
{% else %} 
    {{ listing.date|date:"d M Y" }} 
{% endif %} 

अब आज की तारीख जा रहा है, लेकिन यह काम नहीं करता। मुझे Django दस्तावेज़ों में इसके बारे में कुछ भी नहीं मिला। क्या कोई सलाह दे सकता है?

उत्तर

72

दृश्य में दिनांक की तुलना करें, और in_the_past (बूलियन) जैसे कुछ अतिरिक्त_कॉन्क्स्ट में पास करें।

या बेहतर इसे मॉडल के रूप में मॉडल में जोड़ें।

from datetime import date 

@property 
def is_past_due(self): 
    return date.today() > self.date 

तब ध्यान में रखते हुए:

{% if listing.is_past_due %} 
    In the past 
{% else %} 
    {{ listing.date|date:"d M Y" }} 
{% endif %} 

मूल रूप से टेम्पलेट तिथि तुलना IMO के लिए जगह नहीं है।

+0

हां, मैं मानता हूं कि टेम्पलेट दिनांक तुलना के लिए जगह नहीं है, लेकिन इस स्थिति में यह बहुत अधिक सुरुचिपूर्ण लग रहा था। किसी भी मामले में, मैंने अंततः अपने डीजेंगो मॉडल, पास्ट() में एक विधि लागू की, जो कि तिथि की वर्तमान तारीख से तुलना करता है और यदि यह अतीत में है और अन्यथा गलत है तो सत्य लौटाता है। यह तब टेम्पलेट से बुलाया जाता है। आपका समाधान ठीक या बेहतर काम करता है, मैं यह जानने के लिए उत्सुक था कि टेम्पलेट में ऐसा करने का कोई तरीका था या नहीं। –

+2

मुझे ऐसा नहीं लगता है :(कोडिंग-शैली से, और पीओवी को पुन: सक्रिय करने के लिए, यह 'is_past_due' को अन्य टेम्पलेट्स में आगे की संपत्ति के रूप में पुन: पेश करने में सक्षम होना बेहतर है अन्यथा आपको उसी टेम्पलेट कोड को कॉपी-पेस्ट करना होगा बार-बार। – bx2

+1

यदि आप वाकई वास्तव में गड़बड़ करना चाहते हैं और टेम्पलेट में तिथियों की तुलना करना चाहते हैं तो आपको वर्तमान दिनांक को अतिरिक्त_कॉन्क्स्ट के रूप में पास करना होगा और फिर मानक 'अगर' टैग का उपयोग करें, लेकिन यह सुरुचिपूर्ण समाधान नहीं है .. – bx2

0

आप हमेशा datetime.datetime.now पास कर सकते हैं (चूंकि django मॉडल पायथन के मानक डेटाटाइम ऑब्जेक्ट का उपयोग करते हैं)।

render_to_response उपयोग करके, आप कुछ इस तरह (datetime आयात करने के बाद) कर सकता है: अब जब कि तुम "अब" टेम्पलेट के अंदर, आप दिनांक तुलना कर सकते हैं, जैसा कि आपने में किया था की पहुंच है

return render_to_response('template.html', {'now': datetime.datetime.now()}) 

अपने उदाहरण।

इसके अलावा, यदि आप अपने विचारों में RequestContext का उपयोग करते हैं - यदि आप एकाधिक फ़ाइलों में इसकी आवश्यकता है तो आप "अब" को संदर्भ_प्रोसेसर के रूप में जोड़ पाएंगे। यह RequestContext के साथ दिए गए किसी भी टेम्पलेट में "अब" जोड़ देगा।

हालांकि, यह है कि आप बस सिर्फ रिकॉर्ड है कि अपने मूल क्वेरीसमूह में अब से पहले कर रहे हैं की सूची प्राप्त और पहली जगह में बेकार डेटा के लिए क्वेरी से बचने के अधिक यथार्थवादी है:

listing.objects.filter(date__lt=datetime.datetime.now()) 
+0

अधिकांश परिस्थितियों में फ़िल्टरिंग की सलाह दी जाएगी, लेकिन मेरी स्थिति में यह वांछित प्रभाव नहीं है: मेरे पास कुछ रिलीज तिथियों वाले आइटमों की एक सूची है, और मैं उन वस्तुओं के बीच अंतर करना चाहेंगे जो पहले ही रिलीज़ किए गए हैं और जिन्हें अभी तक रिलीज़ नहीं किया गया है, लेकिन दोनों खोज के लिए प्रासंगिक हैं। किसी कारण से 'अब' वैरिएबल, जैसा कि आपने प्रस्तावित किया है, मेरे लिए काम नहीं किया। मैं अगर समस्या बयान में तुलना की तुलना में अधिक थी, जाहिर है कि Django के सभी संस्करणों में यह उपलब्ध नहीं है। आयात datetime यदि आप प्रयोग किया है:: –

+0

आप इस कोड के साथ आयातित datetime की आवश्यकता है) datetime.datetime.now के बजाय ( फिर से datetime आयात datetime उचित तरीका होगा, datetime.now() यह django के सभी संस्करणों में काम करना चाहिए। आपके द्वारा कौन सा संस्करण उपयोग किया जा रहा है? – monokrome

9

मैं करने के लिए date_now जोड़ा मेरी संदर्भ प्रोसेसर की सूची।

तो टेम्पलेट में वहाँ एक चर "date_now" कहा जाता है जो सिर्फ datetime.datetime.now है()

फ़ाइल context_processors.py

import datetime 

def date_now(request): 
    return {'date_now':datetime.datetime.now()} 

और में में date_now नामक एक संदर्भ प्रोसेसर बनाओ settings.py, इसे शामिल करने, मेरे मामले में यह

app_name.context_processors.date_now 
1

@ BX2 लाभकारी जवाब के अलावा है, यदि आपके क्षेत्र एक datetime क्षेत्र सिर्फ फोन घ है CONTEXT_PROCESSORS संशोधित खाया() मॉडल datetimefield को समारोह:

from datetime import date 

@property 
def is_past_due(self): 
    if date.today() > self.date.date(): 
     return True 
    return False 
0

मैं इस सवाल मिल गया और एक ऐसी ही समस्या थी। मैं जानकारी प्रदर्शित करना चाहता था अगर यह अतीत में हुआ था।

टेम्पलेट में Django के "timesince" टैग का उपयोग करके मैं अपनी समस्या का समाधान करने में सक्षम था। मैं यह नहीं कह रहा कि यह कुशल है, लेकिन यह मेरे लिए काम करता है।

खाका में:

{% if model_name.date_time|timesince >= "1 min" %} 
    <p>In the past</p> 
{% else %} 
    <p>{{ model_name.date_time }}</p> 
{% endif %} 
+0

यह त्वरित समाधान के रूप में भी अनुशंसित नहीं है, क्योंकि आप स्ट्रिंग की तुलना कर रहे हैं। एक दिन के बाद आप '1" की तुलना कर रहे हैं> = "1 मिनट" 'जो 'गलत' है, जबकि आप 'ट्रू' की अपेक्षा करते हैं – blacklwhite

7

Django 1.8 के रूप में थोड़ा अरुचिकर निर्माण निम्नलिखित काम करता है:

{% now "Y-m-d" as todays_date %} 
{% if todays_date < someday|date:"Y-m-d" %} 
    <h1>It's not too late!</h1> 
{% endif %} 

hackish, लेकिन यह एक कस्टम टैग या संदर्भ प्रोसेसर के लिए जरूरत से बचा जाता है।