Ta đã gặp ir.actions.act_window nhiều lần — nó là window action, loại action phổ biến nhất, dùng để "mở một model ở các view". Nhưng bên trong nó có một loạt field quyết định action mở ra cái gì và mở như thế nào. Field đáng nhớ nhất là target: chỉ đổi từ mặc định sang new, action đang chiếm cả trang biến thành một popup nổi lên. Bài này mổ xẻ các field của act_window.
target: toàn trang hay popup
Trong module demo, nút "Cộng điểm..." mở một wizard. Bí quyết để nó bật lên dạng dialog thay vì chuyển trang chỉ là target="new":

Hình 1: Action wizard với target="new". Bảng giá trị target: current (mặc định, thay vùng chính), new (popup), inline, fullscreen, main. Bên dưới là các field hay dùng khác của act_window.
Popup bật lên thật
Bấm nút "Cộng điểm..." trên form thẻ — wizard hiện lên ngay trên form, không rời trang:

Hình 2: target="new" biến action thành dialog: "Cộng điểm hàng loạt" nổi lên giữa màn hình, form thẻ phía sau bị làm mờ. Người dùng điền rồi Lưu/Huỷ, xong dialog đóng và quay lại đúng chỗ cũ. Đây chính là "wizard" — một form tạm hiện dạng popup.
Kiểu popup này hợp với tác vụ ngắn, không rời ngữ cảnh: nhập nhanh vài thông số, xác nhận một thao tác. Nếu để target="current", wizard sẽ chiếm cả trang và người dùng cảm giác "đi mất" khỏi form đang xem.
Những field khác của act_window
Ngoài target, act_window có nhiều field tinh chỉnh hành vi:
res_id— mở thẳng form một bản ghi cụ thể (thay vì danh sách). Rất hay dùng khi muốn nhảy tới đúng một record.domain— lọc sẵn danh sách khi action mở, ví dụ[('diem','>',0)]chỉ hiện thẻ còn điểm.context— truyềndefault_x(điền sẵn khi tạo),search_default_x(bật sẵn bộ lọc),active_id... như các bài trước.view_id— ép action dùng một view cụ thể thay vì view mặc định Odoo tự chọn.limit— số bản ghi mỗi trang (mặc định 80).
Điều đáng nhớ: method Python trả về một dict act_window y hệt — cùng bộ field này (ta đã làm ở bài smart button với action_xem_lich_su). Action khai bằng XML hay sinh bằng Python thì cấu trúc giống nhau; chỉ khác nơi định nghĩa.
Vài lưu ý
target="new"cho wizard,currentcho điều hướng chính. Đừng để tác vụ nhập nhanh chiếm cả trang, cũng đừng nhồi một màn hình lớn vào popup chật.res_id+view_mode=formlà cách mở thẳng một bản ghi; kết hợptarget=newđược một form bản ghi dạng popup.contextchảy xuống view — mọidefault_/search_default_bạn đặt trong action context sẽ áp cho view mà action mở.view_idchỉ ép một view; muốn ép nhiều kiểu view thì dùngviews(danh sách cặp id–kiểu), nhưng phần lớn trường hợpview_idlà đủ.
Ba ý mang về
ir.actions.act_windowlà window action — mở một model ở các view;targetquyết định cách mở:current(toàn trang, mặc định),new(dialog popup/wizard),fullscreen,main,inline.- Các field tinh chỉnh:
res_id(mở thẳng một bản ghi),domain(lọc sẵn),context(default/search_default),view_id(ép view),limit(số/trang). - Method Python trả về dict act_window cùng bộ field — action khai XML hay sinh bằng code đều một cấu trúc; chọn
target=newcho tác vụ ngắn không rời ngữ cảnh.
Window action mở view. Nhưng có loại action khác không mở gì cả — chỉ chạy logic. Bài sau: Phần sau về server action — các loại (chạy code Python, cập nhật bản ghi, gửi email, tạo record...) và cách gắn chúng vào nút, menu, hay tự động hoá.