2015-12-30 39 views
1

我通過Django模板標籤文檔搜索,沒有找到簡單的方法按名稱顯示日期的上一個或下一個月。例如,給定2015年12月1日的日期,我希望以模板標籤取回下個月'Jan'的名稱。上一個或下一個月的Django模板標籤名稱

爲了回到這一年,我可以這樣做:{{ selected_date|date:"Y"|add:"-1" }}以獲得上一年。

這似乎相當普遍,我認爲功能將在那裏,而不必編寫自定義標籤。

+1

如果我沒有記錯,覆蓋日期範圍的存檔默認視圖通過在上下文中傳入多個日期對象來完成此操作 - 這可能也是我所要做的。否則,你可以編寫一個自定義過濾器來做到這一點 - 我不認爲有內置的過濾器。 –

回答

1

MonthArchiveView在模板上下文中提供了next_monthprevious_month

但是,我認爲你必須創建一個自定義過濾器來顯示任意日期的下個月和上個月。

爲下一個/上一年添加過濾器可能是個好主意 - 我認爲{{ selected_date|previous_year }}{{ selected_date|date:"Y"|add:"-1" }}更清晰。

0

感謝您的回覆。我沒有在上下文中傳入多個對象,而是編寫了一個快速自定義模板標籤,因爲沒有內置標籤。這是我的樣子。

views.py

#... 
return render(request, 'index.html', 
       context={'selected_date': selected_date}) # As @Peter DeGlopper mentioned, alternative could have been to pass in 

的index.html

{% load template_extras %} 

<label>{% get_prev_month_name %}</label> 
<label>{% get_next_month_name %}</label> 

appname中/ templatetags/template_extras.py

import datetime 

from django import template 

register = template.Library() 


@register.simple_tag(takes_context=True) 
def get_next_month_name(context): 
    selected_date = context['selected_date'] 
    next_month = selected_date.month % 12 + 1 
    return datetime.date(1900, next_month, 1).strftime("%b") 

@register.simple_tag(takes_context=True) 
def get_prev_month_name(context): 
    selected_date = context['selected_date'] 
    prev_month = selected_date.month - 1 
    if prev_month == 0: 
     prev_month = 12 
    return datetime.date(1900, prev_month, 1).strftime("%b") 

# As @Alasdair mentioned, can create additional tags for say 'previous_year' to make code cleaner 

注意:在更改模板標記代碼時,不要忘記重新啓動服務器,將應用程序添加到您的INSTALLED_APPS變量settings.py中,並在您的templatetags文件夾(如果Python 2)中添加__init__.py

+1

如果你打算手動計算它,我喜歡通過增加或減去一個合適的'timedelta'來完成,而不是處理模塊化算術或if語句的環繞情況。 EG,如果'selected_date'是第一個月中的第一個,請添加'timedelta(days = 31)'以確保您在下個月,然後'replace(day = 1)'將該日期設置爲第一個。或者減去'timedelta(days = 1)'得到前一個月的最後一天,然後'如果需要'替換''。 –

相關問題