Django模板嵌套for循环:如何通过字段名获取模型对象值?
解决Django模板动态访问对象字段的问题
这个问题我之前开发的时候也踩过坑!Django模板默认不支持这种动态属性访问的写法,你直接写{{ j }}.{{ h }}会被模板引擎当成字符串拼接,所以才会输出obj1.field_name这种内容,而不是实际的字段值。下面给你两个实用的解决办法:
方法一:自定义模板过滤器(推荐)
这是最灵活的方案,适合需要在模板里频繁做动态属性访问的场景:
- 首先在你的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)
- 在需要使用的模板顶部加载这个过滤器:
{% load custom_filters %}
- 之后在嵌套循环里就可以用这个过滤器来动态获取字段值了:
<tbody> {% for j in dat %} <tr> {% for h in hed %} <td>{{ j|get_attr:h }}</td> {% endfor %} </tr> {% endfor %} </tbody>
方法二:在视图中预处理数据
如果你的场景不需要太灵活,也可以在视图层把模型对象转换成字典,这样模板里就能直接用键访问:
- 在视图里使用
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})
- 这时模板里原来的
{{ 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
相关产品推荐
相关产品推荐

