Ở bài statusbar ta đặt câu hỏi: trạng thái hiện ra rồi, nhưng ai đổi, khi nào, đổi từ gì sang gì? Câu trả lời nằm ở khung bên phải mỗi form Odoo — chatter. Nó ghi lịch sử thay đổi, cho đăng ghi chú và tin nhắn, hiện hoạt động cần làm, và cho người theo dõi nhận thông báo. Tất cả gắn thẳng vào bản ghi. Và để có nó, bạn gần như không viết code. Bài này bật chatter cho thẻ thành viên và xem nó tự ghi lại mọi thứ.
Ba bước để có chatter
# 1) Model PHẢI kế thừa mail.thread (+ mail.activity.mixin nếu muốn hoạt động)
class TheThanhVien(models.Model):
_name = 'quan.the.thanh.vien'
_inherit = ['mail.thread', 'mail.activity.mixin']
# 2) tracking=True: đổi field này sẽ TỰ ghi log vào chatter
diem = fields.Integer('Điểm tích luỹ', tracking=True)
trang_thai = fields.Selection([...], tracking=True)
<!-- 3) View: chỉ cần MỘT thẻ <chatter/> sau </sheet> -->
<sheet> ... </sheet>
<chatter/>

Hình 1: Ba bước. (1) model _inherit mail.thread (điều kiện tiên quyết — không có nó thì không có message_ids). (2) tracking=True trên field: mỗi lần field đổi, chatter tự ghi "giá trị cũ → mới". (3) một thẻ <chatter/> trong form. Đăng ghi chú/tin bằng message_post; cho ai đó theo dõi bằng message_subscribe.
Xem thật: chatter ghi lại mọi thứ
Mình đổi điểm VIP-0001 (120→150), đổi trạng thái (Mới cấp→Đang dùng), và đăng một ghi chú. Đây là chatter thật:

Hình 2: Chatter chạy thật (khung phải). Trên cùng: nút Gửi tin / Ghi chú / Hoạt động. Mục Hoạt động đã lên kế hoạch hiện việc "Gọi mời gia hạn thẻ VIP" (đến hạn 3 ngày). Mục Hôm nay là dòng thời gian: dòng đầu là log thay đổi tự động — "120 → 150 (Điểm tích luỹ)" và "Mới cấp → Đang dùng (Trạng thái)" nhờ tracking=True; dòng dưới là ghi chú mình đăng. Không dòng nào phải tự vẽ.
Điểm mạnh nhất: dòng "120 → 150" và "Mới cấp → Đang dùng" tự sinh khi mình gán field. Không viết một dòng log nào — chỉ tracking=True. Đây là kiểm toán (audit trail) miễn phí cho mọi thay đổi quan trọng.
Ba khả năng của chatter
- Theo dõi thay đổi (tracking): field có
tracking=Truetự ghi mỗi lần đổi giá trị, kèm ai và khi nào. Dùng cho field quan trọng (trạng thái, số tiền, người phụ trách). - Tin nhắn & ghi chú: Gửi tin (message) gửi cho người theo dõi (có thể ra email); Ghi chú (log note) chỉ nội bộ. Gọi bằng
message_post(body=..., subject=..., message_type='comment'|'notification'). - Người theo dõi (followers):
message_subscribe(partner_ids=[...])cho ai đó "theo dõi" bản ghi — họ nhận thông báo khi có tin mới. Số người theo dõi hiện ở góc chatter. - Hoạt động (từ
mail.activity.mixin): việc cần làm gắn bản ghi (xem bài activity) hiện ngay trên chatter.
Vài lưu ý Odoo 19
<chatter/>là cú pháp gọn của Odoo 19 — trước đây phải viết một khối<div class="oe_chatter">với ba fieldmessage_follower_ids,activity_ids,message_ids. Giờ chỉ một thẻ.- Không có
mail.threadthì<chatter/>lỗi — thiếu fieldmessage_ids. Nhớ_inheritvàdependscó'mail'. tracking=Truechỉ log field bạn đánh dấu — đừng bật tràn lan, chỉ field đáng theo dõi, tránh chatter ngập log vụn.message_postgửi thật khi có người theo dõi — cẩn thận trong test/script để không gửi email ngoài ý muốn.trackingcó thể kèm thứ tự:tracking=10,tracking=20... để sắp thứ tự các field trong một log gộp.
Ba ý mang về
- Chatter là khung lịch sử + trao đổi bên phải form; để có nó cần model
_inheritmail.threadvà một thẻ<chatter/>trong view (Odoo 19 gọn còn một thẻ). tracking=Truetrên field tự ghi log thay đổi vào chatter ("120 → 150", "Mới cấp → Đang dùng") — kiểm toán miễn phí, không viết code log. Đã chứng minh trên VIP-0001.- Chatter còn cho đăng tin/ghi chú (
message_post), người theo dõi (message_subscribe) và hoạt động (từmail.activity.mixin) — tất cả gắn thẳng vào bản ghi.
Ta đã dựng gần trọn một form nghiệp vụ đầy đủ. Lần sau quay lại chủ đề quyền: Phần sau mổ xẻ thuộc tính groups trên field và phần view — cách ẩn một field, một nút, hay cả một tab chỉ cho đúng nhóm người dùng được thấy.