You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模板语法错误求助:通过索引获取月份名称失败

解决Django模板中通过月份索引获取月份名称的TemplateSyntaxError问题

问题场景

你在Django视图中传递了月份名称列表months到模板,尝试通过months[month_num]的方式根据月份数字索引获取对应名称时,触发了TemplateSyntaxError错误。

视图代码

def stats2_view(request):
    monthly_expenses={}
    months_ = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    # if request.method == 'POST':
    #     year = request.POST.get('selected_year')
        # if year:
    expenses = Expense.objects.filter(owner=request.user, date__year=2024)
    monthly_expenses = calculate_expense_month_summary(expenses) 
    years = range(2010, datetime.datetime.now().year+1)
    return render(request, 'expense/stats2.html', {'expense_month_data': monthly_expenses,'yr': years,'months':months_})

模板代码

<div class="col-md-6">
          <h2>Details</h2>
          <div class="text-md-start center-paragraph">
            <h3>For the year 2024 the break down for each month is as follows</h3>
            {% for month_num, expense in expense_month_data.items %}
              <p>Total amount spent in {{ months[month_num]}} till now is <span class="fw-bold">{{ expense }}</span></p>
            {% endfor %}
          </div>
      </div>

错误原因

Django模板引擎不支持Python原生的列表[索引]语法,months[month_num]这种写法违反了模板语法规则,因此抛出TemplateSyntaxError。另外需要注意:你的months_列表索引从0开始对应1月(January),而month_num如果是1-12的数字,直接取索引会导致月份名称错位(比如month_num=1会取到February)。

解决方案

方案1:自定义模板过滤器(推荐,保留原数据结构)

  1. 在你的Django应用下创建templatetags目录,新增__init__.py和custom_filters.py文件:
# templatetags/custom_filters.py
from django import template

register = template.Library()

@register.filter
def get_item(lst, index):
    try:
        # 转换为整数并修正索引(month_num是1-12,列表索引0-11)
        return lst[int(index)-1]
    except (IndexError, ValueError):
        return "Unknown Month"
  1. 在模板顶部加载自定义过滤器:
{% load custom_filters %}
  1. 修改模板中的月份名称调用:
{{ months|get_item:month_num }}

方案2:在视图中提前处理数据

直接在视图中将月份数字转换为对应的名称,传递处理后的列表给模板:

def stats2_view(request):
    monthly_expenses={}
    months_ = [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
    expenses = Expense.objects.filter(owner=request.user, date__year=2024)
    monthly_expenses = calculate_expense_month_summary(expenses) 
    # 转换数据结构,包含月份名称和金额
    processed_expenses = []
    for month_num, amount in monthly_expenses.items():
        processed_expenses.append({
            'month_name': months_[month_num-1],
            'amount': amount
        })
    years = range(2010, datetime.datetime.now().year+1)
    return render(request, 'expense/stats2.html', {'expense_month_data': processed_expenses,'yr': years})

然后修改模板循环逻辑:

{% for item in expense_month_data %}
  <p>Total amount spent in {{ item.month_name }} till now is <span class="fw-bold">{{ item.amount }}</span></p>
{% endfor %}

内容的提问来源于stack exchange,提问作者Shashank

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 12:25:02