如何在 Odoo 19 中向 Chatter 发布消息
在 Odoo 中,Chatter(聊天面板)功能对于促进沟通和深入了解各类业务流程至关重要。它简化了用户间的互动,提升了协作效率。在 Odoo 19 版本中,Chatter 被广泛应用于销售、项目、任务、开票等多个模块,是保障沟通顺畅、让用户及时了解业务进展的强大工具。
下方图片展示了通过 Chatter 传递的流程详情。

从上图的 Chatter 中可以看到:销售订单的创建记录、销售订单的确认状态及确认人信息,此外还能查看为相关用户生成的待办事项。
一、通过代码向 Chatter 程序化发布消息
在某些情况下,需要通过代码在 Odoo 19 中向 Chatter 自动发布消息。例如,在自动化工作流(如订单状态流转)或基于特定操作(如按钮点击)发布更新时,可能需要直接通过代码触发消息,而非依赖用户手动输入。
借助 Odoo 的内置方法(message_post())即可实现这一需求,从而根据预设条件自动发送通知、提醒或状态更新。这种自定义消息发布方式能确保关键信息及时传递,无需人工干预。
示例:学生课程状态跟踪模型
假设我们创建一个名为student.info的模型,用于跟踪学生信息及其课程状态(状态选项:“draft”(草稿)、“in_progress”(进行中)、“completed”(已完成))。当用户点击 “开始课程” 或 “完成课程” 按钮时,系统需更新课程状态,并自动向 Chatter 发布消息通知这一变更。
- start_course方法:将课程状态改为 “in_progress”(进行中),并发送 “课程已开始” 的消息。
- complete_course方法:将课程状态改为 “completed”(已完成),并发送 “课程已结束” 的消息。
通过这种自定义设置,每次课程状态变更时,Chatter 都会自动发布消息,确保相关人员实时知晓。
def start_course(self):
self.state = 'in_progress'
self.message_post(body=_("学生课程已开始"))
def complete_course(self):
self.state = 'completed'
self.message_post(body=_("学生课程已结束"))
二、message_post()方法的参数说明
message_post()是 Odoo 中用于向 Chatter 发布消息的核心方法,其主要参数如下:
- body:消息内容(类型:字符串 | Markup 对象)。若传入字符串,系统会自动对内容进行转义处理;若需包含 HTML 格式内容(如超链接、样式),需传入 Markup 对象。
- message_type:消息类型,取值来源于mail.message.type字段(如“comment”(评论)、“notification”(通知))。
- parent_id:用于私密对话场景,指定父消息 ID,使当前消息成为对某条历史消息的回复。
- attachments:附件列表,格式为元组组成的列表[(附件名称, 附件内容)],其中附件内容无需进行 base64 编码。
- body_is_html:布尔值,指定body参数中的字符串是否应被解析为 HTML 格式(即使未传入 Markup 对象)。
- kwargs:额外关键字参数,用于为新创建的mail.message记录(Chatter 消息的底层数据记录)设置默认字段值。
- email_from:指定消息作者的邮箱地址。
上述示例代码的结果如下:

三、自定义 Chatter 消息的显示效果
这就是我们可以轻松向 Chatter 添加消息的方式。接下来,让我们探讨一下在 Odoo 19 中可以对消息外观进行的更改。
例如,如果学生的姓名包含在消息中,我们可以将其转换为指向相应学生记录的超链接。这可以使用 _get_html_link() 函数来实现。此外,我们还可以包含主题、修改消息样式,并在使用 message_post() 函数时添加作者以指示消息的发送者。以下是实现此功能的代码。
def start_course(self):
self.state = 'in_progress'
self.message_post(
body=_("学生%s的课程已开始。", self.parent_id._get_html_link(title=self.name)),
author_id=self.env.ref('base.partner_root').id,
# 指定作者为系统根合作伙伴
subject='课程开始', # 消息主题
message_type='comment', # 消息类型为“评论”
subtype_xmlid='mail.mt_comment' # 消息子类型(对应Odoo内置的“评论”子类型)
)
def complete_course(self):
self.state = 'completed'
self.message_post(
body=_("学生%s的课程已结束。", self.parent_id._get_html_link(title=self.name)),
author_id=self.env.ref('base.partner_root').id,
subject='课程结束',
message_type='comment',
subtype_xmlid='mail.mt_comment'
)
上述代码的结果如下:
从图中可清晰看到:消息中包含了学生姓名(超链接形式)、预设的消息内容、消息主题,且样式与系统模板保持一致。

四、总结
该方法适用于所有关联了 Chatter 的 Odoo 记录(如销售订单、项目任务、发票等),且支持根据具体需求自定义消息内容与外观,具备高度的灵活性。
关键点回顾
- Odoo 19 中向 Chatter 发布消息的核心方法是 message_post(),可在业务逻辑方法中直接调用实现自动发消息。
- message_post() 支持丰富的参数配置,包括消息内容、类型、作者、主题、附件等,可满足不同场景的需求。
- 通过 _get_html_link() 等函数可自定义消息显示效果,比如添加超链接、指定作者和主题,提升消息的可读性和交互性。