Odoo 16中如何在计划动作里渲染模板?
在Odoo 16计划动作中渲染模板的正确方法
一、通过Python模型方法渲染(解决render_template无效问题)
根据模板类型选择对应渲染方式,以下是具体实现:
1. 邮件模板渲染示例
在model/.py中编写计划动作执行方法:
from odoo import models, api class YourCustomModel(models.Model): _inherit = 'res.partner' # 可继承现有模型或自定义新模型 def scheduled_render_email_template(self): # 筛选需要处理的目标记录 target_records = self.search([('is_customer', '=', True)]) # 引用你的邮件模板(替换为实际xml_id) email_template = self.env.ref('your_module.email_template_demo') for rec in target_records: # 渲染模板内容 rendered_content = email_template.render_template( email_template.xml_id, self._name, rec.id, post_process=True # 自动处理图片、链接等资源 ) # 后续逻辑:如发送邮件、保存渲染内容等 # self.env['mail.mail'].create({'body_html': rendered_content, ...}).send()
2. 普通QWeb模板渲染示例
若为非邮件类QWeb模板,直接使用ir.qweb接口:
def scheduled_render_general_qweb(self): # 引用普通QWeb模板 qweb_template = self.env.ref('your_module.general_template_demo') # 构造渲染上下文 render_context = { 'record': self.browse(1), # 传入目标记录 'custom_data': '自定义变量内容' } # 执行渲染 rendered_html = self.env['ir.qweb']._render(qweb_template, render_context) # 处理渲染结果
二、直接在XML计划动作中关联模板(邮件场景快捷方式)
若需求是定时发送邮件,可直接在views/.xml的计划动作中调用邮件模板的发送方法:
<record id="scheduled_action_send_email" model="ir.cron"> <field name="name">定时发送客户邮件</field> <field name="model_id" ref="base.model_res_partner"/> <field name="state">code</field> <!-- 调用邮件模板的send_mail方法 --> <field name="code"> model.env['mail.template'].browse(ref('your_module.email_template_demo')).send_mail(record.id, force_send=True) </field> <field name="interval_number">1</field> <field name="interval_type">day</field> <field name="numbercall">-1</field> <!-- 无限次重复执行 --> </record>
常见问题排查
- 确认模板的
xml_id引用正确,无拼写错误 - 计划动作执行用户需拥有模板、目标模型的访问权限
- 渲染时传入的记录ID需有效,模板中使用的字段需在目标模型中存在
- 若
render_template无返回,检查是否未传入正确的模型名称或记录ID
内容的提问来源于stack exchange,提问作者Ayush Singhal
相关产品推荐
相关产品推荐

