Django模板语言中能否用变量作为属性名访问其他变量属性?
问题原因
- Django模板的点属性访问语法默认是字面量匹配:你代码中写
user.fruit时,模板会直接查找User模型中名为fruit的固定字段,不会将fruit解析为循环变量对应的动态水果名,因此无法读取到对应水果的属性值。 - 代码存在语法疏漏:
<tr>标签未在用户循环内闭合,会导致表格DOM结构异常,渲染错乱。
解决方案
首先需要自定义模板过滤器实现动态属性读取,步骤如下:
- 在你的Django应用目录下新建
templatetags文件夹,文件夹内新增空文件__init__.py,再新建过滤器文件custom_filters.py,写入以下代码:
from django import template register = template.Library() @register.filter def get_attr(obj, attr_name): # 读取对象的动态属性,不存在则返回空字符串 return getattr(obj, attr_name, '')
- 在模板顶部引入自定义过滤器:
{% load custom_filters %}
- 修正原表格模板代码,使用过滤器读取动态属性,同时补全闭合标签:
{% for user in users %} <tr> <td>{{ user.title }} </td> <td>{{ user.text }} </td> {% for fruit in fruitlist %} <td>{{ user|get_attr:fruit }} </td> {% endfor %} </tr> {% endfor %}
表单场景代码说明
你补充的表单场景代码逻辑是正确的,核心就是通过get_attr过滤器动态读取用户和表单对应水果名的属性:当用户对应水果属性为真时直接显示勾选标记,否则渲染对应的表单输入控件。
内容的提问来源于stack exchange,提问作者LarsLill
相关产品推荐
相关产品推荐

