Django模板是否支持在变量内部嵌套动态模板变量
Django模板变量嵌套取值问题解答
Django原生模板语法不支持直接在变量解析路径中嵌套另一个变量,你写的{{ api_external_prices.{{ asset_class.slug }}.usd }}形式不符合模板引擎解析规则,无法正常取到值。
以下是两种经过验证的可落地方案:
方案1:视图层预处理(优先推荐)
Django模板本身定位是弱逻辑的展示层,不适合承载复杂的数据组装逻辑,把价格匹配的工作放到视图层处理是可维护性最高、性能最好的选择。
在视图中遍历加密资产列表时,提前把对应币种的价格绑定到资产对象上即可:
# 视图逻辑示例 for asset in objects__list_cryptoAssets: price_map = api_external_prices.get(asset.slug, {}) asset.price_usd = price_map.get("usd", 0) asset.price_eur = price_map.get("eur", 0)
模板中直接读取预绑定的属性即可,不需要做动态键解析:
{% for crypto_asset in objects__list_cryptoAssets %} <tr role="row" class="body-row"> <td role="cell">{{ crypto_asset.price_usd }}</td> </tr> {% endfor %}
方案2:自定义模板过滤器(无视图修改权限时使用)
如果不方便调整视图逻辑,可以写一个通用的字典/对象取值过滤器,通过链式过滤器实现动态键取值。
- 在对应app的
templatetags目录下新建custom_filters.py,写入以下代码:from django import template register = template.Library() @register.filter def get_item(source, key): # 兼容字典和对象两种取值场景,key不存在时返回空值避免模板报错 if isinstance(source, dict): return source.get(key, {}) return getattr(source, key, {}) - 在模板顶部加载自定义过滤器,之后就可以动态传入slug取值:
{% load custom_filters %} {% for crypto_asset in objects__list_cryptoAssets %} <tr role="row" class="body-row"> <td role="cell">{{ api_external_prices|get_item:crypto_asset.slug|get_item:"usd" }}</td> </tr> {% endfor %}
小提示:不要为了实现这个功能贸然替换默认模板引擎为Jinja2,除非项目本身已经有Jinja2的使用规划,否则会带来额外的适配成本。
内容的提问来源于stack exchange,提问作者Marcos Benvenuto
相关产品推荐
相关产品推荐

