Odoo Discuss消息添加按钮:自定义模块打包问题求助
解决Odoo自定义模块无法覆盖原thread.xml的问题
嘿,这个问题我之前帮好几个开发者踩过坑——直接改核心mail模块的代码确实能快速跑通功能,但要打包成独立的自定义模块,得严格遵循Odoo的视图继承和模块加载规则,不能直接复制替换原文件。下面一步步给你调整方案:
1. 正确继承mail的thread视图(替代直接复制thread.xml)
Odoo的前端视图支持通过xpath定位到原视图的特定节点,然后插入/修改内容,而不是全盘复制原文件。你需要在自定义模块的views目录下新建一个xml文件(比如mail_thread_extension.xml),写法如下:
<?xml version="1.0" encoding="utf-8"?> <odoo> <record id="mail_message_thread_inherit" model="ir.ui.view"> <field name="name">mail.message.thread.inherit</field> <field name="model">mail.message</field> <field name="inherit_id" ref="mail.message_thread"/> <!-- 继承原thread视图 --> <field name="arch" type="xml"> <!-- 定位到"Mark as read"按钮所在的父节点 --> <xpath expr="//button[@name='mark_as_read']/parent::div" position="inside"> <!-- 添加你的新按钮,替换成你的自定义方法名 --> <button name="action_send_to_lead" type="object" string="Send to Lead" class="btn btn-secondary"/> </xpath> </field> </record> </odoo>
2. 正确继承mail.message模型的业务逻辑
不要直接修改核心的mail_message.py,而是在自定义模块的models目录下新建文件(比如mail_message.py),通过继承扩展原模型:
from odoo import models, api, _ class MailMessage(models.Model): _inherit = 'mail.message' def action_send_to_lead(self): # 这里写你的自定义逻辑,比如创建销售线索、关联消息等 for message in self: # 示例:创建一个新的销售线索 self.env['crm.lead'].create({ 'name': f"Lead from Message: {message.subject or message.body[:50]}", 'description': message.body, # 其他关联字段根据你的需求补充 }) return {'type': 'ir.actions.act_window_close'}
3. 配置自定义模块的manifest文件
确保你的__manifest__.py里正确声明依赖和加载资源:
{ 'name': 'Mail Message to Lead', 'version': '1.0', 'category': 'Tools', 'depends': ['mail', 'crm'], # 依赖mail和crm模块(如果用到销售线索) 'data': [ 'views/mail_thread_extension.xml', ], 'installable': True, 'auto_install': False, }
4. 最后一步:刷新缓存并升级模块
做完上面的配置后,需要:
- 在Odoo后台进入「应用」模块,点击「刷新应用列表」
- 找到你的自定义模块,点击「升级」
- 清除浏览器缓存(按
Ctrl+Shift+R强制刷新),避免前端加载旧的xml文件
关键提醒
永远不要直接修改Odoo核心模块的代码!这样做不仅会在Odoo版本升级时丢失所有修改,还会导致模块之间的兼容性问题。通过继承扩展的方式,既能保留核心功能,又能安全地添加自定义逻辑。
内容的提问来源于stack exchange,提问作者SkiBY
相关产品推荐
相关产品推荐

