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

如何在Adaptive Card中渲染数组元素?Python传参问题求助

解决Adaptive Card模板结合Python渲染数组的问题

你遇到的核心问题是混淆了Adaptive Card原生模板引擎和Python模板引擎的用法。既然你用Python传递数据并以{{ }}替代原生${},说明你是直接用Python生成最终的Adaptive Card JSON,而非依赖Adaptive Card的模板渲染功能,所以应该用Python模板引擎的循环语法来遍历数组,而非Adaptive Card的$data绑定。

正确实现方式(以Jinja2为例)

假设你的Python数据结构如下:

content = [
    {"code": "登录成功"},
    {"code": "数据加载完成"},
    {"code": "操作已提交"}
]

Adaptive Card模板写法

直接用Jinja2的{% for %}循环生成数组对应的组件:

{
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "Container",
      "items": [
        {% for item in content %}
        {
          "type": "TextBlock",
          "text": "{{ item.code }}",
          "size": "Medium"
        }{% if not loop.last %},{% endif %}
        {% endfor %}
      ]
    }
  ]
}

Python渲染代码

from jinja2 import Template

# 定义模板字符串(或从文件读取)
card_template = """
{
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "Container",
      "items": [
        {% for item in content %}
        {
          "type": "TextBlock",
          "text": "{{ item.code }}",
          "size": "Medium"
        }{% if not loop.last %},{% endif %}
        {% endfor %}
      ]
    }
  ]
}
"""

# 渲染模板
template = Template(card_template)
final_card = template.render(content=content)

# 输出最终的Adaptive Card JSON
print(final_card)

为什么之前的方法无效?

  • 用$data="${content}"结合{{ code }}:这是混合了两种模板系统,Python处理完{{ code }}后,Adaptive Card引擎无法识别已被替换的变量;且如果不启用Adaptive Card模板渲染,$data本身不会生效。
  • 直接用${code}:Python模板引擎不会处理${},所以会直接输出占位符。
  • 单个元素{{ content[0].code }}有效:这是Python模板引擎直接读取数组元素,属于正常的变量引用,没有涉及循环逻辑。

额外注意事项

  • 循环中要处理逗号:用{% if not loop.last %},{% endif %}保证生成的JSON语法正确,避免最后一个元素后多逗号。
  • 如果必须保留Adaptive Card原生模板渲染:需要避免语法冲突,比如将Python模板标记改为其他符号(如{% raw %}包裹Adaptive Card的${}部分),但这种情况不适合你当前用Python直接传递数据的场景。

内容的提问来源于stack exchange,提问作者Guilani_folk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:38