Ở bài 195, model thẻ thành viên đã có list và form đẹp. Nhưng có một vấn đề: người dùng chưa có cách nào bấm vào để mở — ta phải gõ URL kỹ thuật. Cần thêm hai mảnh: action (bảo Odoo "mở cái gì") và menu (chỗ để bấm). Xong hai thứ này, model của bạn thành một app có menu riêng trên thanh ứng dụng, ngang hàng Bán hàng, Tồn kho.
Action và menu: hai khái niệm bổ trợ
- Action (
ir.actions.act_window): định nghĩa "khi kích hoạt thì mở model nào, ở dạng view nào". Nó là hành động, chưa phải chỗ bấm. - Menu (
menuitem): một mục menu người dùng thấy và bấm; khi bấm, nó chạy một action.
Ta khai cả hai trong views/menus.xml:

Hình 1: File menus.xml. Window action action_the_thanh_vien: mở model quan.the.thanh.vien ở view_mode list,form (vào là thấy danh sách, bấm một dòng ra biểu mẫu). Rồi hai menuitem: một menu gốc "Quán Cà Phê" (thành một app trên thanh trên), và một menu con "Thẻ thành viên" (parent trỏ menu gốc, action trỏ tới action vừa khai). sequence quyết định thứ tự sắp xếp.
Đừng quên khai file này vào data của __manifest__.py — không thì Odoo bỏ qua nó khi cài.
Cài vào Odoo — app xuất hiện trên thanh trên
Sau khi cập nhật module, một app mới hiện lên với menu con dẫn thẳng vào danh sách:

Hình 2: App "Quán Cà Phê" giờ nằm trên thanh trên cùng (menu gốc), với mục con "Thẻ thành viên". Bấm vào, Odoo chạy action → mở đúng danh sách Thẻ thành viên đã dựng ở bài 195. Từ một model Python, qua vài dòng XML, ta có một app hoàn chỉnh có lối vào rõ ràng — y như các app gốc của Odoo.
Ghép lại toàn bộ chuỗi
Nhìn lại bốn bài lập trình vừa qua, ta thấy Odoo lắp ghép rất mạch lạc:
- Module (
__manifest__.py) — khung chứa mọi thứ. - Model (Python) — dữ liệu, tự tạo bảng.
- View (XML) — cách hiển thị (list, form).
- Action + Menu (XML) — lối vào cho người dùng.
Mỗi mảnh một việc, ghép lại thành một tính năng hoàn chỉnh. Đây chính là "giải phẫu" của bất kỳ app Odoo nào — kể cả Bán hàng, Kho: chỉ là quy mô lớn hơn.
Lưu ý khi làm action & menu
- Menu gốc không cần
action(nó chỉ là nhóm); menu con mới trỏ action để có gì đó mở ra. view_modeliệt kê thứ tự —list,formnghĩa vào thấy list trước. Muốn vào thẳng form thìform,list.- Khai file vào
datacủa manifest và cập nhật module (-u) — quên là menu không hiện. sequenceđể sắp xếp menu; số nhỏ lên trước.- Cần quyền truy cập thì người dùng mới thấy dữ liệu khi bấm menu — đúng chủ đề bài sau.
Nhớ ba ý
- Action (
ir.actions.act_window) định nghĩa mở model nào, view nào; menuitem tạo chỗ bấm và chạy action đó. - Menu gốc thành một app trên thanh trên; menu con (
parent+action) là lối vào dữ liệu — nhớ khai file vàodatacủa manifest. - Chuỗi Module → Model → View → Action/Menu là giải phẫu chung của mọi app Odoo.
Menu đã mở ra danh sách, nhưng nếu người dùng không có quyền thì bấm vào sẽ báo lỗi. Phần sau ta khai quyền truy cập model qua ir.model.access.csv — cho ai được đọc/ghi/xoá dữ liệu.