Odoo 10社区版:自定义模块替换基础邮件模板的技术咨询
当然可以用相同ID的记录替换Odoo基础模块里的邮件模板,这是Odoo中扩展或修改基础功能的常规操作,我之前做过好多次类似的需求。下面分点解答你的三个问题:
1. 自定义模块能否通过相同ID替换标准基础模板?
绝对可以。Odoo的XML数据记录是通过外部ID(格式为模块名.记录ID)来唯一识别的。只要你的自定义模块在__manifest__.py的depends列表中添加了sale模块(确保加载顺序在sale之后),然后在你的模块XML文件中使用和原模板完全相同的外部ID(比如sale.mail_template_sale_order)创建mail.template记录,Odoo就会用你的记录覆盖原有的基础模板。
2. 标签内应如何编写?
这里要注意原模板的noupdate属性:Odoo基础模块里的大部分数据(包括sale的订单邮件模板)都是放在<data noupdate="1">标签下的,这意味着这些记录在模块更新时不会被Odoo重新覆盖,只有第一次安装时会创建。
所以要修改这类记录,你需要在自定义模块的XML中做以下操作:
- 首先用
<data noupdate="0">包裹你的修改记录,这样Odoo会在模块安装或升级时应用你的修改(因为noupdate="0"表示这条记录允许被更新)。 - 修改完成后,如果你想让自己的自定义模板固定下来,避免后续模块更新时被意外覆盖,可以把标签改成
<data noupdate="1">。
示例代码如下:
<odoo> <!-- 先使用noupdate="0"来应用修改 --> <data noupdate="0"> <record id="sale.mail_template_sale_order" model="mail.template"> <!-- 覆盖原模板的主题 --> <field name="subject">您的销售订单 ${object.name} 已生成</field> <!-- 覆盖原模板的邮件内容 --> <field name="body_html" type="html"> <div style="font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 14px;"> <p>尊敬的客户:</p> <p>您的销售订单 <strong>${object.name}</strong> 已成功创建,详情如下:</p> <p>订单金额:${object.amount_total} ${object.currency_id.name}</p> <p>如需查看完整订单,请点击 <a href="${object.get_base_url()}/my/orders/${object.id}">此处</a>。</p> </div> </field> </record> </data> <!-- 如果确认修改没问题,后续可以改成noupdate="1"保护你的自定义模板 --> <!-- <data noupdate="1"> <record id="sale.mail_template_sale_order" model="mail.template"> ... 你的模板内容 ... </record> </data> --> </odoo>
3. 若sale模块更新会发生什么情况?
分两种情况来看:
- 常规情况:sale模块的基础邮件模板是标记为
noupdate="1"的,所以当Odoo更新sale模块时,官方不会覆盖你已经修改过的模板。因为noupdate="1"的记录,Odoo只会在第一次安装sale模块时创建,后续更新sale模块时会跳过这些记录的修改。 - 极端情况:如果官方在某次sale模块更新中,修改了原模板的
noupdate属性为0,同时修改了模板内容,那么更新sale模块时可能会和你的自定义修改产生冲突。不过这种情况非常罕见,Odoo官方一般不会改动基础数据的noupdate属性,因为会影响大量用户的自定义配置。
另外,如果你在自定义模块中把原记录的noupdate改成了0,那么每次升级自定义模块时,你的修改会再次应用;但sale模块更新时,只要原记录还是noupdate="1",就不会影响你的模板。
最后补充个小建议:修改前最好先备份原模板内容,或者在测试环境先验证效果,避免影响生产环境的邮件发送。
内容的提问来源于stack exchange,提问作者M.E.




