Bạn để ý một menu Odoo mở ra đã lọc sẵn "chỉ đơn của tôi", một menu khác bấm Mới là form đã điền sẵn vài ô. Không có JavaScript nào phía sau, cũng không phải view đặc biệt. Tất cả nằm ở hai trường của chính cái ir.actions.act_window đứng sau menu đó: domain và context. Bài này dựng một action "Thẻ đang hiệu lực" dùng cả hai để thấy rõ mỗi cái làm gì.
Hai trường, hai nhiệm vụ khác nhau
domain lọc danh sách bản ghi được thấy. context mang thông tin đi kèm — trong đó hai khoá đặc biệt hữu ích: default_X (điền sẵn field khi tạo bản ghi mới) và search_default_X (bật sẵn một bộ lọc hoặc nhóm khi mở):

Hình 1: Action "Thẻ đang hiệu lực". domain=[('trang_thai','=','dang_dung')] là một list tuple điều kiện — chỉ những thẻ đang dùng lọt qua. context là một dict: mỗi khoá default_<field> điền sẵn giá trị đó khi tạo mới, còn search_default_<tên> bật sẵn một filter/groupby đã khai trong search view. Cả hai đều là biểu thức được eval, nên viết đúng cú pháp Python.
domain — danh sách rút gọn ngay khi mở
Toàn hệ thống có 4 thẻ, nhưng mở menu này chỉ thấy 2 — đúng số thẻ dang_dung:

Hình 2: Cùng model, nhưng action này chỉ hiện 2/4 thẻ — hai thẻ hết hạn và bị khoá bị domain lọc ra. Góc phải ghi "1-2 / 2". Đồng thời danh sách đã nhóm sẵn theo Hạng thẻ nhờ search_default_gb_hang=1 — không cần người dùng tự bấm nhóm. Bảng tìm kiếm bên trái cũng chỉ còn thấy trạng thái "Đang dùng" vì domain đã giới hạn phạm vi.
Điểm quan trọng: domain của action là hàng rào cứng ở tầng này — người dùng gõ tìm kiếm thêm cũng chỉ tìm trong phạm vi đó, không thể "thoát" ra thấy thẻ khoá. Khác với record rule (bảo mật theo dòng), domain của action chỉ là lối vào tiện lợi, không phải cơ chế an ninh — ai có action khác vẫn xem được các thẻ kia.
context — điền sẵn khi bấm Mới
Bấm Mới trong chính action đó, form hiện ra đã được điền theo các default_X:

Hình 3: Form tạo mới mở từ action này — Hạng thẻ đã là "Vàng" (default_hang_the='vang'), trạng thái đã ở "Đang dùng" (default_trang_thai='dang_dung', thấy ở statusbar), và default_nhan_km=True bật sẵn nhận tin. Người dùng chỉ việc gõ nốt phần còn lại. Tên tạm "TV-2026-### [Vàng]" cũng phản ánh hạng mặc định.
Điều đáng nói: các default_X này chảy vào form qua context, và context của action truyền tiếp xuống mọi thao tác mở từ đó. Nên nếu form có nút tạo bản ghi liên quan, context (kể cả default_) vẫn đi theo — đôi khi gây điền sẵn ngoài ý muốn ở chỗ không mong đợi. Đó là mặt trái cần nhớ.
Vài lưu ý khi dùng
domainlà list tuple,contextlà dict — cả hai lưu dạng chuỗi và đượceval. Viết sai dấu ngoặc là action không mở được.default_<field>phải đúng tên kỹ thuật của field, và giá trị đúng kiểu: Selection truyền mã ('vang'không phải'Vàng'), Boolean truyềnTrue/False, Many2one truyền id.search_default_<name>:namelà tên của<filter>hoặc<field>/groupby đã khai trong search view. Gán1để bật; sai tên thì im lặng không có tác dụng.- Context còn nhận biến động:
active_id,active_ids,uidcó sẵn; và bạn có thể dùng{'default_partner_id': active_id}để điền sẵn theo bản ghi đang mở (hay gặp ở nút thông minh).
Ba ý mang về
domainlọc sẵn danh sách ngay khi mở action (list rút còn 2/4) — tiện lối vào, nhưng không phải bảo mật (đó là việc của record rule).contextvớidefault_Xđiền sẵn field khi tạo mới,search_default_Xbật sẵn filter/groupby khi mở — biến một menu chung thành lối làm việc chuyên biệt mà không cần view riêng.- Cú pháp phải chuẩn: domain là list tuple, context là dict, tên field/filter phải đúng — sai thì hoặc lỗi mở, hoặc lặng lẽ vô tác dụng.
Action mới chỉ mở một danh sách. Nhưng có loại action chạy thẳng trên nhiều bản ghi bạn tick chọn — xoá hàng loạt, đổi trạng thái cả lô. Phần sau đi vào action chạy trên nhiều bản ghi qua menu ⚙ Tác vụ, và cách nhận active_ids.