上个月或下个月名称的Django模板标记

时间:2015-12-30 22:20:40

标签: django django-templates

我搜索了Django模板标签文档,并没有找到一个简单的方法来显示日期的上个月或下个月的名称。例如,鉴于2015年12月1日的日期,我希望将下个月'Jan'的名称作为模板标记返回。

为了回归这一年,我可以:{{ selected_date|date:"Y"|add:"-1" }}来获得前一年。

似乎相当普遍,我认为无需编写自定义标记即可实现功能。

3 个答案:

答案 0 :(得分:1)

MonthArchiveView在模板上下文中提供next_monthprevious_month

但是,我认为你必须创建一个自定义过滤器来显示任意日期的下个月和上个月。

为下一个/上一年添加过滤器可能是一个好主意 - 我认为{{ selected_date|previous_year }}{{ selected_date|date:"Y"|add:"-1" }}更清晰。

答案 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>

<强>应用程序名称/ 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

注意:在更改模板标签代码时不要忘记重新启动服务器,将应用程序添加到settings.py中的INSTALLED_APPS变量,并在templatetags文件夹中添加__init__.py(如果是Python 2) )。

答案 2 :(得分:0)

您还可以使用python dateutil.relativedelta根据给定的日期计算上个月或下个月。

from dateutil.relativedelta import relativedelta
from django import template

register = template.Library()


def calculate_date(date, **kwargs):
    """
    Performs date calculation based on an interval.
    Args:
        date (datetime object): The date to which the interval is calculated to.
        **kwargs: Accepts a relative time interval with a positive or negative
            integer to determine if we will add or subtract to the date.
    """
    return date + relativedelta(**kwargs)

@register.assignment_tag
def get_previous_month(selected_date):
    return calculate_date(selected_date, months=-1).strftime("%b")

@register.assignment_tag
def get_next_month(selected_date):
    return calculate_date(selected_date, months=+1).strftime("%b")