Ở bài trước ta dựng form view. Giờ tới người anh em hay gặp nhất: list view — bảng danh sách bản ghi. Nhìn thì đơn giản, nhưng một list view tốt làm được nhiều hơn "hiện vài cột": nó tự sắp xếp, tô màu dòng quan trọng, cộng tổng ở chân bảng, và cho người dùng bật/tắt cột. Tất cả bằng thuộc tính XML, không cần JavaScript. Bài này dựng list thật cho thẻ thành viên và xem từng thuộc tính hiện ra sao.
Các thuộc tính trên thẻ list và field
<list string="Thẻ thành viên"
default_order="diem desc" <!-- sắp xếp mặc định -->
decoration-success="diem >= 100" <!-- hàng ≥100 điểm: XANH -->
decoration-muted="diem == 0"> <!-- hàng 0 điểm: XÁM MỜ -->
<field name="name"/>
<field name="partner_id"/>
<field name="hang_the"/>
<field name="diem" sum="Tổng điểm"/> <!-- cộng tổng ở chân bảng -->
<field name="currency_id" column_invisible="1"/> <!-- ẩn cột, vẫn nạp -->
<field name="so_du" sum="Tổng số dư"/>
<field name="trang_thai" optional="hide"/> <!-- cột tuỳ chọn, mặc định ẩn -->
</list>

Hình 1: Năm thuộc tính đáng nhớ. default_order sắp xếp mặc định; decoration-* tô màu dòng theo biểu thức; sum cộng tổng cột số ở chân bảng; column_invisible ẩn cột nhưng vẫn nạp dữ liệu (cần cho monetary); optional="hide" biến cột thành tuỳ chọn — người dùng tự bật.
Xem kết quả thật
Cài list này rồi mở danh sách thẻ, đây là kết quả thật với 4 thẻ:

Hình 2: Cùng list ở Hình 1, render ra giao diện. default_order: các dòng xếp giảm dần theo điểm (150 → 120 → 85 → 0). decoration-success: VIP-0003 (150) và VIP-0001 (120) tô xanh vì ≥100. decoration-muted: VIP-0004 (0 điểm) xám mờ. sum: chân bảng cộng tổng điểm 355 (=150+120+85+0). Icon ở đầu cột bên phải là nút bật/tắt cột tuỳ chọn như "Trạng thái".
Con số 355 không phải mình gõ tay — Odoo tự cộng cột diem của 4 dòng. Màu xanh/xám cũng do biểu thức tự đánh giá trên từng dòng.
Bảng thuộc tính hay dùng
default_order="field desc|asc": sắp xếp mặc định khi mở list. Nhiều tiêu chí:"diem desc, name asc".decoration-XXX="biểu_thức": tô màu/kiểu dòng theo biểu thức Python trên field của dòng đó. Các giá trị:success(xanh),info(lam),warning(cam),danger(đỏ),muted(xám mờ),bf(đậm),it(nghiêng).sum="Nhãn"(vàavg): cộng tổng / trung bình cột số ở chân bảng. Chỉ dùng cho field số.column_invisible="1": ẩn cột khỏi bảng nhưng vẫn nạp dữ liệu — cần khi một widget khác phụ thuộc (nhưmonetarycầncurrency_id).optional="hide"/optional="show": biến cột thành tuỳ chọn, người dùng bật/tắt qua icon ở góc bảng; trạng thái được nhớ.editable="top"/editable="bottom": cho sửa ngay trong list, không cần mở form — tiện cho dòng chi tiết.
Vài lưu ý Odoo 19
- Thẻ là
<list>, không phải<tree>. Odoo 19 đổi tên;<tree>cũ vẫn được nhận cho tương thích nhưng nên viết<list>. decoration-*đánh giá bằng Python trên field đang hiện, nên field dùng trong biểu thức phải có mặt (kể cảcolumn_invisible).invisiblekháccolumn_invisible:invisible(trên field) ẩn giá trị theo điều kiện từng dòng;column_invisibleẩn cả cột.widgetvẫn dùng được trong list:badgecho trạng thái,handleđể kéo sắp xếp,progressbarcho phần trăm.
Ba ý mang về
- List view giàu tính năng nhờ thuộc tính XML, không cần JS:
default_order(sắp xếp),decoration-*(tô màu dòng theo biểu thức),sum/avg(tổng cột),column_invisible(ẩn cột vẫn nạp),optional(cột người dùng bật/tắt). - Đã chứng minh thật: 4 thẻ xếp giảm theo điểm, hàng ≥100 tô xanh, hàng 0 điểm xám mờ, chân bảng cộng tổng 355 — tất cả tự động.
- Odoo 19 dùng
<list>(không<tree>); phân biệtcolumn_invisible(ẩn cột) vớiinvisible(ẩn giá trị theo dòng); field trongdecoration-*phải được nạp.
Hai loại view chính đã xong. Lần sau tới view "đẹp" nhất và cũng phức tạp nhất: Phần sau mổ xẻ kanban view và QWeb — cách vẽ mỗi bản ghi thành một tấm thẻ với template QWeb, dùng biến và điều kiện ngay trong HTML.