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

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:自定义模板过滤器(无视图修改权限时使用)

如果不方便调整视图逻辑,可以写一个通用的字典/对象取值过滤器,通过链式过滤器实现动态键取值。

  1. 在对应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, {})
    
  2. 在模板顶部加载自定义过滤器,之后就可以动态传入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:54:26