在dify工作流中需用模板转换节点动态拼接数据,支持变量插入({{var}})、安全转义(默认html转义,含html内容需加|safe)、条件判断({%if%})、循环渲染({%for%},需确保传入数组)、过滤器链式处理(如truncate、tojson)及局部变量定义({%set%})。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在Dify工作流中动态拼接用户输入、API返回数据和固定文案,生成结构清晰的提示词或下游系统可解析的JSON,必须用好模板转换节点。
基础变量插入与安全转义
在模板编辑区直接使用 {{ variable_name }} 插入上游节点传来的字符串变量。Jinja2默认对输出内容做HTML转义,防止XSS注入——这是默认保护机制,【不可关闭】。
若变量本身是纯文本(如用户姓名、标题),直接插入即可;若变量含HTML标签(如从富文本编辑器提取的内容),需显式取消转义:{{ html_content | safe }}。
不加 | safe 却渲染含 <b></b> 的内容,页面只会显示文字“加粗”,而非加粗效果。
条件分支控制文案逻辑
方法一:单层判断
{% if user_role == "admin" %}欢迎管理员{{ username }},您可访问全部模块{% else %}欢迎{{ username }},当前权限仅限查看{% endif %}
方法二:多级嵌套(注意缩进不影响逻辑,但影响可读性)
{% if status == "paid" %}
{% if amount > 1000 %}尊享VIP服务{% else %}标准会员权益{% endif %}
{% elif status == "trial" %}试用期剩余{{ days_left }}天
{% else %}请完成支付激活{% endif %}
注意:Jinja2中 == 比较的是值,不强制类型一致;但 "1" 和 1 在模板中视为不同值,建议上游统一转为字符串再传入。
循环渲染列表数据
第一步:确认上游传入的是合法JSON数组,例如:[{"title":"第一章","page":5},{"title":"第二章","page":12}]
第二步:在模板中用 {% for item in chapter_list %} 开始遍历,用 {% endfor %} 结束
第三步:在循环体内引用字段,如 {{ item.title }}(第{{ item.page }}页)
第四步:添加序号或分隔符(可选):{{ loop.index }}. {{ item.title }} —— loop.index 从1开始计数,loop.index0 从0开始
若传入的不是数组而是单个对象,循环将报错且整个模板渲染失败,【务必在调试面板确认变量类型】。
过滤器链式处理文本
方法1:截断超长文本并加省略号
{{ raw_summary | truncate(80, True, "……") }}
方法2:清理空白后首字母大写
{{ product_name | trim | title }}
方法3:数字格式化(注意:模板内不能做计算,仅格式化已有数值)
{{ price | float | round(2) | string }} 元
方法4:JSON序列化用于调试或下游透传
{{ user_profile | tojson }}
tojson 过滤器会自动添加双引号、转义特殊字符,并确保输出是合法JSON字符串,比手动拼接可靠得多。
模板中定义局部变量
使用 {% set %} 声明临时变量,避免重复计算或冗长表达式:
{% set full_name = first_name ~ " " ~ last_name %}
您好,{{ full_name | upper }}!
波浪号 ~ 是Jinja2的字符串拼接操作符,比 + 更安全(+ 在遇到None时会报错,~ 会自动转为空字符串)。
set 定义的变量只在当前模板作用域生效,不能跨节点传递。











