如何在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
相关产品推荐
相关产品推荐

