You need to enable JavaScript to run this app. Odoo13中如何编程获取记录token?自定义模块mail template URL参数为空问题
优惠活动
大模型
产品
解决方案
定价
更多

Odoo13中如何编程获取记录token?自定义模块mail template URL参数为空问题

核心现象判断

从最终生成的超链接编码结果可以确认:模板内编写的${...} 格式表达式完全没有被Odoo的模板引擎解析,直接以原文形式输出到HTML中,才会被浏览器编码为$%7B...%7D 的格式。这不是参数值为空,是模板渲染流程没有识别到编写的占位符语法。

Odoo13参数为空的排查方向
  • 首先校验邮件模板的渲染引擎配置
    Odoo13的邮件模板支持两种渲染模式:如果模板的render_engine 字段配置为默认的inline_template,仅支持Python字符串替换逻辑,只会识别{{ 占位符 }} 格式的变量,完全不会处理${} 格式的QWeb表达式,就会导致所有写的QWeb语法原封不动输出。需要把模板的渲染引擎切换为qweb 模式,才能正常解析${...} 格式的逻辑表达式。
  • 其次确认各变量的取数逻辑正确性
    • 关于记录token的获取:Odoo13里大部分自定义业务模型(如休假审批hr.leave)默认没有内置的access_token 字段,直接读取object.access_token 本身就会取空值。正确的生成方式是调用模型内置的token生成方法_generate_access_token(),这个方法会为当前记录生成持久化的公开访问token,对应模板内的正确写法为token=${object._generate_access_token()},方法执行时会自动把生成的token写入当前模型的对应字段,供后续路由校验使用。
    • 关于action参数的取值:编写的action=${'action_id' in ctx and ctx['action_id'] or ''} 语法本身在QWeb渲染逻辑中没有错误,但模板中的ctx 变量仅能读取邮件发送时传入的上下文参数。如果在触发邮件发送的代码逻辑里,没有通过send_mail() 方法的context参数注入action_id 的键值,表达式就会走到取空字符串的分支。如需让action参数正常取值,需要在调用邮件发送接口时,把目标动作ID通过上下文传入,例如:
      template.sudo().with_context(action_id=目标动作ID).send_mail(记录ID)
  • 最后排查HTML转义干扰
    编写链接时不要手动把URL分隔符& 提前转义为&,Odoo的模板引擎在最终输出HTML时会自动做合规的实体编码,手动提前转义很容易打乱表达式的结构,导致模板引擎无法正确识别占位符位置。
修正后的模板参考写法

以休假审批链接为例,正确的链接代码为:
<a href="/leave/validate?res_id=${object.id}&token=${object._generate_access_token()}&action=${ctx.get('action_id', '')}">Approve</a>
调整后模板引擎会先替换所有占位符的值,再自动对输出的HTML做实体转义,不会出现占位符原文输出的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 08:36:04