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

Odoo自定义插件中HTMLField无法渲染上下文变量问题咨询

解决Odoo HTMLField模板占位符不解析问题

问题原因

Odoo的HTMLField仅负责存储HTML内容,默认不会自动解析其中的模板变量占位符。直接输出字段内容时,占位符会被当作纯字符串显示,而非替换为上下文变量的值。

解决方案

有两种常用方式实现占位符解析,按需选择:

方法1:在QWeb模板中使用render过滤器

  1. 传入模板记录到上下文
    在控制器的vals字典中,添加对应的AgreementTemplate记录(根据业务逻辑获取,比如通过协议关联字段或固定ID):

    # 示例:假设协议对象关联了模板,从agreement中获取
    vals['agreement_template'] = agreement.template_id  # 替换为实际获取模板的逻辑
    
  2. 在QWeb模板中解析渲染
    在agreement.portal_detail_view模板里,使用t-raw结合render过滤器解析HTML模板内容,传入需要的上下文变量:

    <div t-raw="agreement_template.body_html | render({'agreement': agreement})"/>
    

    这里的render({'agreement': agreement})会把body_html中的{{agreement.name}}等占位符,替换为实际的agreement对象属性值。

方法2:在控制器中提前渲染模板内容

  1. 导入渲染工具
    在控制器文件顶部导入Odoo的模板渲染工具:

    from odoo.tools import render_template
    
  2. 在控制器中渲染HTML模板
    获取模板记录后,直接渲染并将结果传入模板上下文:

    # 获取对应的协议模板(替换为实际获取逻辑,比如通过ID或关联关系)
    agreement_template = request.env['agreement.template'].sudo().browse(1)
    # 渲染模板内容,传入上下文变量
    rendered_body = render_template(agreement_template.body_html, {'agreement': agreement})
    # 将渲染后的内容添加到vals中
    vals['rendered_body'] = rendered_body
    
  3. 在QWeb模板中输出结果
    直接输出已渲染好的内容:

    <div t-raw="rendered_body"/>
    

注意事项

  • 编辑body_html字段时,使用Jinja2风格的占位符({{变量名}}),与Odoo QWeb语法保持一致。
  • 确保传递的上下文变量名与占位符中的变量名完全匹配(比如控制器传的是agreement,占位符就用{{agreement.name}})。

内容的提问来源于stack exchange,提问作者Alexander Darlington Agboada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 14:55:13