Chuỗi bài về action khép lại bằng loại có sản phẩm cầm nắm được: report action (ir.actions.report). Nó biến một (hay nhiều) bản ghi thành tài liệu in được — hoá đơn, phiếu, thẻ — bằng cách trỏ tới một template QWeb, để Odoo render HTML rồi xuất ra PDF. Đây cũng là bài thứ 100 của loạt; đúng dịp dựng một thứ hoàn chỉnh: in một tấm thẻ thành viên ra PDF có logo và khung công ty.
Hai mảnh: report action + template QWeb
Report gồm một bản ghi ir.actions.report (khai in cái gì, kiểu gì) và một template QWeb (vẽ nội dung). Report action trỏ tới template qua report_name:

Hình 1: report_type="qweb-pdf" (hoặc qweb-html). report_name phải khớp external id của template. Template dùng t-foreach="docs" để lặp các bản ghi được in, t-call="web.external_layout" mượn khung công ty (header/footer), và t-field để in field tự format. binding_type="report" khiến report hiện ở menu In.
Ba biến/khái niệm cốt lõi của QWeb report:
docs— biến chứa recordset đang in (một hay nhiều bản ghi).web.external_layout— template chuẩn của Odoo bọc nội dung trong khung công ty: logo, địa chỉ, chân trang. Bạn chỉ viết phần ruột.t-fieldvst-esc—t-field="o.ngay_cap"tự format theo kiểu field (ngày ra dd/mm/yyyy, tiền có ký hiệu, selection ra nhãn);t-escin thô giá trị.
Tấm thẻ in ra thật
Sau khi nâng cấp, mở bản render của report cho thẻ VIP-0001:

Hình 2: Report render đầy đủ. Khung công ty (logo, địa chỉ, Tax ID ở đầu; điện thoại/email/website ở chân) đến từ external_layout — tôi không viết dòng nào cho nó. Phần ruột là bảng thông tin thẻ: khách hàng, hạng, điểm, trạng thái, ngày cấp — mỗi ô là một t-field. Cùng report này render ra PDF thật (đo được 54.072 byte qua _render_qweb_pdf).
Đây là kết quả của cả chuỗi: dữ liệu trong model → template QWeb → HTML → PDF. Người dùng chỉ bấm "In", nhận tờ tài liệu chỉn chu.
PDF hay HTML?
qweb-pdfcần wkhtmltopdf (engine chuyển HTML→PDF) cài trên máy chủ. Có sẵn thì bấm In là tải PDF.qweb-htmlkhông cần engine — report hiện thẳng dạng trang web. Hữu ích khi máy chủ thiếu wkhtmltopdf, hoặc để xem nhanh khi phát triển: mở/report/html/<report_name>/<id>là thấy ngay, không cần dựng PDF.
Mẹo phát triển: luôn xem bản HTML trước (/report/html/...) để chỉnh template cho nhanh, rồi mới thử PDF — vì lỗi template hiện rõ ở HTML, còn PDF thì khó soi hơn.
Vài lưu ý
report_namekhớp external id template, gồm cả tên module:quan_ca_phe.report_the_document. Lệch là báo cáo không tìm thấy template.external_layoutcho khung chuẩn; nếu muốn khung trắng trơn, dùngweb.basic_layout.- CSS report khai vào bó
web.report_assets_common/web.report_assets_pdfnếu cần style riêng cho bản in; style inline đơn giản thì viết thẳng như ở đây. t-fieldcần một field thật của bản ghi để biết cách format; biểu thức tính toán thì dùngt-esc.
Ba ý mang về
- Report action (
ir.actions.report) + template QWeb biến bản ghi thành tài liệu in;report_namekhớp external id template,report_typelàqweb-pdfhoặcqweb-html,binding_type="report"đưa nút In vào menu. - Template dùng
docs(recordset in),web.external_layout(khung công ty),t-field(tự format) /t-esc(in thô) — bạn chỉ viết phần ruột, Odoo lo header/footer và chuyển HTML→PDF. qweb-pdfcần wkhtmltopdf;qweb-htmlxem ngay ở/report/html/<name>/<id>— dùng HTML để chỉnh template nhanh khi phát triển.
Vậy là trọn bộ action (window, server, client, URL, report). Sang chương mới: Phần sau về wizard với TransientModel — mô hình "tạm" cho các hộp thoại nhập liệu nhiều bước mà không lưu rác vào cơ sở dữ liệu.