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:自定义模板过滤器(推荐,保留原数据结构)
- 在你的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"
- 在模板顶部加载自定义过滤器:
{% load custom_filters %}
- 修改模板中的月份名称调用:
{{ 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
相关产品推荐
相关产品推荐

