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":

Ảnh chụp đoạn mã nền tối, bản ghi action_them_diem_wizard model ir.actions.act_window với res_model quan.them.diem.wizard, view_mode form, target new mở dialog thay vì chuyển trang; phần liệt kê các giá trị target gồm current mặc định thay nội dung vùng chính, new dialog popup nổi lên, inline nhúng trong form, fullscreen toàn màn hình, main thay cả breadcrumb; phần các field khác gồm res_id mở thẳng form một bản ghi, domain lọc sẵn, context default và search_default, view_id ép view cụ thể, limit số bản ghi mỗi trang

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.

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:

Ảnh chụp giao diện Odoo thật, một hộp thoại popup tiêu đề Cộng điểm hàng loạt nổi lên giữa màn hình che mờ form thẻ phía sau, bên trong có ô Số điểm cộng thêm giá trị 10, một danh sách Thẻ áp dụng liệt kê VIP-0001, ô Lý do, và hai nút Lưu và Huỷ bỏ ở dưới; phía sau lờ mờ là form thẻ VIP-0001

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ền default_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, current cho đ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=form là cách mở thẳng một bản ghi; kết hợp target=new được một form bản ghi dạng popup.
  • context chảy xuống view — mọi default_/search_default_ bạn đặt trong action context sẽ áp cho view mà action mở.
  • view_id chỉ ép một view; muốn ép nhiều kiểu view thì dùng views (danh sách cặp id–kiểu), nhưng phần lớn trường hợp view_id là đủ.

Ba ý mang về

  1. ir.actions.act_window là window action — mở một model ở các view; target quyết định cách mở: current (toàn trang, mặc định), new (dialog popup/wizard), fullscreen, main, inline.
  2. 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).
  3. 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=new cho 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á.