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

Django模板中如何通过对象属性动态访问数组元素?

解决Django模板中动态访问数组索引的问题

临时快速解决方法

方法1:视图层转字典适配

把activity_list转换成以周数为键的字典(注意周数和原数组索引的对应关系,比如原数组是0索引、week.number从1开始的话,要做week.number - 1的转换):

# 视图代码示例
activity_dict = {i+1: activities for i, activities in enumerate(activity_list)}
# 将转换后的字典传给模板
return render(request, 'your_template.html', {'plan': plan, 'activity_dict': activity_dict})

模板里直接通过键访问对应周的活动:

{% for week in plan.weeks %}
    <!-- 获取当前周周一的活动 -->
    {{ activity_dict.week.number.0 }}
{% endfor %}

方法2:自定义模板过滤器

写一个极简过滤器实现动态索引访问:

  1. 在你的app下新建templatetags目录,创建custom_filters.py文件:
from django import template

register = template.Library()

@register.filter
def get_item(list_data, index):
    try:
        return list_data[int(index)]
    except (IndexError, ValueError):
        return None
  1. 模板中加载过滤器后使用:
{% load custom_filters %}

{% for week in plan.weeks %}
    <!-- 处理索引偏移(如果周数从1开始) -->
    {% set week_index = week.number|add:"-1" %}
    {{ activity_list|get_item:week_index|get_item:0 }}
{% endfor %}

模型/视图重构方案

方案1:视图层预打包数据

在视图里直接把Plan的周对象和对应周的活动数组打包成元组列表,避免模板里的索引计算:

# 视图代码
week_activity_pairs = []
for week in plan.weeks.all():
    week_index = week.number - 1
    # 处理数组越界情况
    activities = activity_list[week_index] if week_index < len(activity_list) else []
    week_activity_pairs.append( (week, activities) )

return render(request, 'your_template.html', {'week_activity_pairs': week_activity_pairs})

模板里直接循环打包好的列表:

{% for week, activities in week_activity_pairs %}
    <!-- 直接取周一活动 -->
    {{ activities.0 }}
{% endfor %}

方案2:扩展Week模型方法(可选)

如果Week是Plan的关联模型,可以给Week加一个方法,接收activity_list来获取对应周的活动(活动是API动态获取的,不建议存在模型中,仅做临时适配):

# models.py
class Week(models.Model):
    plan = models.ForeignKey(Plan, on_delete=models.CASCADE)
    number = models.IntegerField()

    def get_activities(self, activity_list):
        week_index = self.number - 1
        return activity_list[week_index] if week_index < len(activity_list) else []

模板中调用方法获取活动:

{% for week in plan.weeks %}
    {% set activities = week.get_activities(activity_list) %}
    {{ activities.0 }}
{% endfor %}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 19:32:13