如何以变量形式引用对象属性?模板中该写法为何无效?
问题原因与解决方法
为什么直接写entry.field_name没有内容?
在Django模板语法中,{{ entry.field_name }}会被解析为查找entry对象中名为field_name的静态属性,而不是把field_name作为变量去动态读取它对应的属性值。你的entry对象并没有名为field_name的属性,所以渲染后span标签内是空的。而{{ entry.name }}是直接查找entry的name属性,因此能正常显示内容。
实现变量形式引用对象属性的方法
最稳妥的方式是自定义模板过滤器:
在你的Django应用目录下创建
templatetags文件夹,里面新建两个文件:__init__.py(空文件即可)custom_filters.py(编写过滤器逻辑)
在
custom_filters.py中写入以下代码:
from django import template register = template.Library() @register.filter(name='get_attr') def get_attr(obj, attr_name): # 第二个参数是默认值,避免属性不存在时报错 return getattr(obj, attr_name, '')
- 在需要使用的模板文件开头加载这个过滤器:
{% load custom_filters %}
- 然后在循环中用过滤器动态获取属性:
{% for entry in qs %} {% for field_name in field_names %} <span>{{ entry|get_attr:field_name }}</span> {% endfor %} {% endfor %}
如果只是临时使用,且entry的属性都在对象的__dict__中(比如普通模型字段,不包含@property修饰的属性),也可以直接用字典取值的方式:
<span>{{ entry.__dict__.get(field_name, '') }}</span>
但这种方式局限性较大,优先推荐自定义模板过滤器的方案。
内容的提问来源于stack exchange,提问作者Alston
相关产品推荐
相关产品推荐

