Odoo自定义插件中HTMLField无法渲染上下文变量问题咨询
解决Odoo HTMLField模板占位符不解析问题
问题原因
Odoo的HTMLField仅负责存储HTML内容,默认不会自动解析其中的模板变量占位符。直接输出字段内容时,占位符会被当作纯字符串显示,而非替换为上下文变量的值。
解决方案
有两种常用方式实现占位符解析,按需选择:
方法1:在QWeb模板中使用render过滤器
传入模板记录到上下文
在控制器的vals字典中,添加对应的AgreementTemplate记录(根据业务逻辑获取,比如通过协议关联字段或固定ID):# 示例:假设协议对象关联了模板,从agreement中获取 vals['agreement_template'] = agreement.template_id # 替换为实际获取模板的逻辑在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:在控制器中提前渲染模板内容
导入渲染工具
在控制器文件顶部导入Odoo的模板渲染工具:from odoo.tools import render_template在控制器中渲染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在QWeb模板中输出结果
直接输出已渲染好的内容:<div t-raw="rendered_body"/>
注意事项
- 编辑
body_html字段时,使用Jinja2风格的占位符({{变量名}}),与Odoo QWeb语法保持一致。 - 确保传递的上下文变量名与占位符中的变量名完全匹配(比如控制器传的是
agreement,占位符就用{{agreement.name}})。
内容的提问来源于stack exchange,提问作者Alexander Darlington Agboada
相关产品推荐
相关产品推荐

