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

Django模板嵌套for循环:如何通过字段名获取模型对象值?

解决Django模板动态访问对象字段的问题

这个问题我之前开发的时候也踩过坑!Django模板默认不支持这种动态属性访问的写法,你直接写{{ j }}.{{ h }}会被模板引擎当成字符串拼接,所以才会输出obj1.field_name这种内容,而不是实际的字段值。下面给你两个实用的解决办法:

方法一:自定义模板过滤器(推荐)

这是最灵活的方案,适合需要在模板里频繁做动态属性访问的场景:

  1. 首先在你的Django应用下创建templatetags目录(记得在目录里加一个空的__init__.py文件,让Python把它当成模块),然后新建一个custom_filters.py文件,写入以下代码:
from django import template

register = template.Library()

@register.filter(name='get_attr')
def get_attr(obj, attr_name):
    # getattr第三个参数是默认值,当字段不存在时返回None,你可以改成自己需要的默认内容
    return getattr(obj, attr_name, None)
  1. 在需要使用的模板顶部加载这个过滤器:
{% load custom_filters %}
  1. 之后在嵌套循环里就可以用这个过滤器来动态获取字段值了:
<tbody>
  {% for j in dat %}
    <tr>
      {% for h in hed %}
        <td>{{ j|get_attr:h }}</td>
      {% endfor %}
    </tr>
  {% endfor %}
</tbody>

方法二:在视图中预处理数据

如果你的场景不需要太灵活,也可以在视图层把模型对象转换成字典,这样模板里就能直接用键访问:

  1. 在视图里使用model_to_dict(Django内置工具)把每个模型对象转成字典:
from django.forms.models import model_to_dict
from django.shortcuts import render
from .models import YourModel # 替换成你的模型类

def your_view(request):
    # 获取模型数据
    dat = YourModel.objects.all()
    # 转换成字典列表
    dat_as_dicts = [model_to_dict(item) for item in dat]
    # 你的字段名列表
    hed = ['field_name_1', 'field_name_2', 'field_name_3']
    return render(request, 'your_template.html', {'dat': dat_as_dicts, 'hed': hed})
  1. 这时模板里原来的{{ j.h }}写法就可以正常工作了,因为现在j是字典,h是对应的键名:
<tbody>
  {% for j in dat %}
    <tr>
      {% for h in hed %}
        <td>{{ j.h }}</td>
      {% endfor %}
    </tr>
  {% endfor %}
</tbody>

两种方法都能解决你的问题,个人更推荐第一种模板过滤器的方式,因为它不需要修改视图层的逻辑,而且在模板里复用性更强。

内容的提问来源于stack exchange,提问作者p.ry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:01:47