Ở 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>

Ảnh chụp mã XML nền tối định nghĩa một list Odoo, thẻ list có string Thẻ thành viên, default_order diem desc để sắp xếp giảm dần theo điểm, decoration-success cho biểu thức diem lớn hơn hoặc bằng 100 tô xanh, decoration-muted cho diem bằng 0 tô xám mờ, bên trong các field name partner_id hang_the, field diem có sum Tổng điểm để cộng ở chân bảng, field currency_id có column_invisible bằng 1 để ẩn cột nhưng vẫn nạp dữ liệu, field so_du có sum Tổng số dư, field trang_thai có optional hide là cột tuỳ chọn mặc định ẩn, kèm chú thích decoration hỗ trợ success info warning danger muted

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

Ảnh chụp giao diện Odoo 19 danh sách Thẻ thành viên có bốn dòng, các cột Mã thẻ Khách hàng Hạng thẻ Điểm tích luỹ và Số dư, dòng VIP-0003 Vàng 150 điểm và dòng VIP-0001 Nguyễn Văn An Bạc 120 điểm hiển thị màu xanh vì đạt từ 100 điểm trở lên, dòng VIP-0002 Bạc 85 điểm màu đen bình thường, dòng VIP-0004 Bạc 0 điểm màu xám mờ, các dòng xếp giảm dần theo điểm từ 150 xuống 0, chân bảng có dòng tổng cộng 355 ở cột điểm và 0 đô la ở cột số dư, góc phải cột có biểu tượng bật tắt cột tuỳ chọn

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ư monetary cần currency_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).
  • invisible khác column_invisible: invisible (trên field) ẩn giá trị theo điều kiện từng dòng; column_invisible ẩn cả cột.
  • widget vẫn dùng được trong list: badge cho trạng thái, handle để kéo sắp xếp, progressbar cho phần trăm.

Ba ý mang về

  1. 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).
  2. Đã 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.
  3. Odoo 19 dùng <list> (không <tree>); phân biệt column_invisible (ẩn cột) với invisible (ẩn giá trị theo dòng); field trong decoration-* 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.