Hai bài wizard vừa rồi, method cuối cùng luôn trả về {'type': 'ir.actions.act_window_close'} — làm xong thì đóng hộp thoại, và người dùng đứng lại ở màn hình cũ. Nhưng method của wizard là Python thường: nó trả được bất kỳ action nào. Tận dụng điều đó, ta biến bước cuối thành một cú "đưa người dùng đi tiếp" — chạy xong dẫn thẳng họ tới danh sách kết quả. Bài này đổi wizard cộng điểm để sau khi xác nhận, nó mở luôn danh sách các thẻ vừa cập nhật.

Trả action thay vì đóng

Thay đổi rất nhỏ: bước cuối, thay vì act_window_close, trả một act_window trỏ tới đúng các bản ghi vừa xử lý:

Ảnh chụp đoạn mã nền tối hai phần: phần Trước là return dict act_window_close màu đỏ với chú thích chỉ đóng người dùng đứng yên; phần Sau là method action_cong_diem lặp qua the_ids cộng điểm rồi return dict act_window với name Thẻ vừa cộng điểm, res_model quan.the.thanh.vien, domain id in the_ids.ids đúng bản ghi vừa xử lý, view_mode list form, target current; kèm chú thích method wizard trả được act_window act_url report hay wizard bước sau, mẹo hay là xử lý xong đưa thẳng người dùng tới kết quả

Hình 1: Trước — act_window_close chỉ đóng dialog. Sau — action_cong_diem cộng điểm rồi trả một act_window mở danh sách thẻ, domain=[('id','in', self.the_ids.ids)] để chỉ hiện đúng các thẻ vừa xử lý, target='current' (thay nội dung, không popup).

Vì method wizard là code Python bình thường, nó trả về được mọi loại action ta đã học: act_window (mở danh sách/form), act_url (mở link/PDF), report action, hay thậm chí một wizard bước sau.

Xác nhận rồi thấy kết quả ngay

Chạy wizard trên thẻ VIP-0004, bấm qua các bước và "Xác nhận cộng điểm". Ngay sau đó, Odoo không để lại form cũ mà mở thẳng danh sách:

Ảnh chụp giao diện Odoo thật một danh sách có đường dẫn breadcrumb Thẻ thành viên VIP-0004 rồi Thẻ vừa cộng điểm, tiêu đề danh sách là Thẻ vừa cộng điểm, hiển thị 1 trên 1 bản ghi, một dòng VIP-0004 hạng Bạc 10 điểm trạng thái Đã khoá; bên trái có bảng lọc Hạng thẻ và Trạng thái

Hình 2: Sau khi xác nhận, wizard đóng và mở đúng danh sách "Thẻ vừa cộng điểm" (thấy ở breadcrumb và tiêu đề) — chỉ chứa thẻ vừa xử lý (VIP-0004, giờ 10 điểm). Người dùng thấy ngay kết quả thao tác của mình, không phải tự đi tìm.

Nhìn action trả về — qua shell

Bản chất chỉ là dict action method trả về. Gọi trực tiếp để thấy rõ:

Ảnh chụp phiên odoo shell tạo wizard với active_ids của VIP-0004, gọi action_cong_diem, kết quả trả về một dict với type ir.actions.act_window, name Thẻ vừa cộng điểm, res_model quan.the.thanh.vien, domain id in 48 đúng các thẻ vừa xử lý, view_mode list form, target current; kèm chú thích web client nhận dict này rồi điều hướng tới danh sách kết quả

Hình 3: action_cong_diem() giờ trả về một dict act_window (domain lọc đúng id 48 — VIP-0004). Web client nhận dict này và điều hướng tới danh sách. Không có phép thuật client-side nào; tất cả nằm ở dict method trả về.

Vài mẫu "đi tiếp" hay dùng

  • Mở danh sách kết quả: act_window với domain lọc đúng bản ghi vừa tạo/sửa — như ở đây.
  • Mở thẳng một bản ghi: act_window với res_id + view_mode='form' — hợp khi wizard tạo một bản ghi và muốn đưa người dùng vào form của nó.
  • Tải file/báo cáo: trả act_url (/report/pdf/...) hay report action — wizard nhập tham số xong, xuất luôn PDF.
  • Đi bước wizard sau: trả act_window mở một wizard khác (hoặc chính nó, như bài nhiều bước).

Vài lưu ý

  • target: current để thay màn hình chính (đi hẳn tới kết quả); new nếu muốn kết quả cũng ở dạng popup.
  • Đặt name cho action để breadcrumb/tiêu đề rõ nghĩa ("Thẻ vừa cộng điểm"), thay vì tên mặc định của model.
  • domain lọc đúng bản ghi vừa xử lý — dùng self.the_ids.ids (id các bản ghi wizard vừa đụng tới), đừng mở cả danh sách rồi để người dùng tự lọc.
  • Wizard vẫn đóng khi trả action khác act_window_close; action mới thay thế nó.

Ba ý mang về

  1. Method wizard trả được bất kỳ action nào, không chỉ act_window_close — tận dụng để "đưa người dùng đi tiếp" tới kết quả thay vì bỏ họ ở màn hình cũ.
  2. Mẫu phổ biến: trả act_window với domain lọc đúng bản ghi vừa xử lý (danh sách kết quả), hoặc res_id (mở thẳng một form), hoặc act_url/report (tải file).
  3. Chỉ là dict method trả về: đặt name cho breadcrumb rõ nghĩa, target='current' để đi hẳn tới kết quả; web client lo phần điều hướng.

Chuỗi wizard khép lại ở đây. Quay về mảng report — bài trước ta gắn report action; bài sau đi sâu vào chính nội dung: Phần sau về viết template QWeb cho PDF — cú pháp t-foreach, t-if, t-field, bảng, tổng cộng, và cách bố cục một trang in cho đẹp.