You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:11:51