2010-09-26 57 views
33

我想將日期與Django中的當前日期進行比較,最好在模板中進行比較,但在呈現模板之前也可以這樣做。如果日期已過,我想說「過去」,而如果是將來,我想給出日期。如何在Django中比較日期

我希望人們可以做這樣的事情:

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

隨着現在是今天的日期,但這不起作用。在Django文檔中我找不到任何關於此的信息。任何人都可以提供一些建議

回答

72

在視圖中比較日期,並將諸如in_the_past(boolean)之類的內容傳遞給extra_context。

或者最好將它作爲屬性添加到模型中。

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

是的,我同意模板不是日期比較的地方,但在這種情況下,它看起來更優雅。無論如何,我最終在我的django模型中實現了一個方法inPast(),它將日期與當前日期進行比較,如果它在過去時返回True,否則返回false。然後從模板中調用。你的解決方案工作的更好或更好,我只是想知道是否有辦法在模板中做到這一點。 – 2010-09-26 17:18:41

+2

我不這麼認爲:(同樣來自編碼風格和重構POV,能夠在其他模板中進一步重現'is_past_due'作爲屬性更好,否則你必須複製粘貼相同的模板代碼 – bx2 2010-09-26 17:20:53

+1

如果你真的真的想要在模板中混淆並比較日期,那麼必須將當前日期作爲extra_context傳遞,然後使用標準的if標記,但這不是優雅的解決方案。 – bx2 2010-09-26 17:23:10

0

您可以始終傳遞datetime.datetime.now(因爲django模型使用Python的標準日期時間對象)。

使用選擇render_to_response,你可以做這樣的事情(進口日期時間後):

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

現在你已經到「現在」的模板裏面,你可以比較日期,就像你在做訪問您的例子。此外,如果您在視圖中使用RequestContext - 如果您需要在多個文件中使用它,則可以將「now」添加爲context_processor。這會將「現在」添加到使用RequestContext呈現的任何模板中。

但是,它是更現實的,你只是剛剛獲得的是以前,現在在你原來的查詢集記錄名單,並避免在第一時間查詢無用的數據:

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

在大多數情況下,過濾將是明智的,但在我的情況下,這不是預期的效果:我有一個包含某些發佈日期的項目列表,想要區分已發佈的項目和尚未發佈的項目,但都與搜索有關。出於某種原因,如您所提議的那樣,「now」變量不適合我。假設這個問題比if語句中的比較大,顯然這在所有版本的Django中都是不可用的。 – 2010-09-27 21:48:51

+0

你需要有與此代碼進口日期時間: 進口日期時間 如果你使用: 從日期時間日期時間進口 然後正確的方法是,datetime.now()而不是datetime.datetime.now() 這應該適用於所有版本的django。你正在使用哪個版本? – monokrome 2010-10-18 23:16:06

9

我加date_now我上下文處理器列表。

所以在模板有一個名爲「date_now」變量,它只是datetime.datetime.now()

請叫date_now上下文處理器在文件context_processors.py

import datetime 

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

而且在settings.py,修改CONTEXT_PROCESSORS包括它,在我的情況下,它

app_name.context_processors.date_now 
1

除了@ BX2有益的答案,如果你的領域是一個日期時間字段只需要調用d吃()函數模型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 2016-05-18 13:07:27

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,但它避免了自定義標記或背景處理器的需要。