【问题标题】:Django Template Tag for Previous or Next Month Name上个月或下个月名称的 Django 模板标签
【发布时间】:2016-04-04 22:29:38
【问题描述】:

我搜索了 Django 模板标签文档,但没有找到一种简单的方法来按名称显示日期的上个月或下个月。例如,给定日期为 2015 年 12 月 1 日,我希望取回下个月的名称“Jan”作为模板标签。

要找回当年,我可以:{{ selected_date|date:"Y"|add:"-1" }} 找回上一年。

这似乎相当普遍,以至于我认为无需编写自定义标签就可以实现该功能。

【问题讨论】:

  • 如果我没记错的话,涵盖日期范围的存档默认视图通过在上下文中传入多个日期对象来做到这一点——这可能也是我会做的。否则,您可以编写一个自定义过滤器来执行此操作 - 我认为没有内置过滤器。

标签: django django-templates


【解决方案1】:

MonthArchiveView 在模板上下文中提供next_monthprevious_month

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

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

【讨论】:

    【解决方案2】:

    感谢您的回复。我没有在上下文中传入多个对象,而是编写了一个快速自定义模板标签,因为没有内置标签。这是我的样子。

    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
    

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

    【讨论】:

    • 如果您要手动计算它,我喜欢通过添加或减去适当的 timedelta 来完成此操作,而不是使用模运算或 if 语句处理环绕情况。例如,如果您的selected_date 是哪个月份的第一个月,请添加timedelta(days=31) 以确保您在下个月,然后replace(day=1) 将该日期设置为第一个月。或减去timedelta(days=1) 得到上个月的最后一天,然后减去replace(如果需要)。
    【解决方案3】:

    您还可以使用 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")
    

    【讨论】:

      猜你喜欢
      • 2018-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      相关资源
      最近更新 更多