Một field Selection để mặc định chỉ là chữ, một Boolean là ô tick nhỏ xíu. Nhưng cùng những field ấy, gắn đúng widget vào là bảng dữ liệu sáng hẳn: hạng thẻ thành nhãn màu, mức ưu tiên thành dãy sao bấm một phát là chọn, cờ nhận tin thành công tắc gạt qua gạt lại. Bài này gom ba widget hiển thị nhỏ mà cực kỳ hay dùng — badge, priority, boolean_toggle — và đặt cả ba lên cùng một danh sách thẻ thành viên để thấy chúng phối hợp.

Khai báo: field bình thường, widget lo phần đẹp

Điểm chung của cả ba: model không có gì đặc biệt — chỉ là Selection và Boolean thường. Toàn bộ khác biệt nằm ở thuộc tính widget trong view.

Ảnh chụp đoạn mã nền tối gồm phần model khai uu_tien là Selection ba mức Bình thường Chú ý Ưu tiên và nhan_km là Boolean mặc định True, kèm ghi chú hang_the là Selection sẵn có bac và vang; phần view list đặt uu_tien widget priority, hang_the widget badge với decoration-info cho bac và decoration-warning cho vang, và nhan_km widget boolean_toggle; cuối ảnh ghi decoration tô màu badge theo điều kiện Python còn priority và boolean_toggle ghi ngay khi bấm

Hình 1: uu_tien (Selection 3 mức) + nhan_km (Boolean) là field thường. Ở view, widget="priority" biến Selection thành sao, widget="badge" biến hang_the thành nhãn màu (tô theo decoration-*), widget="boolean_toggle" biến Boolean thành công tắc.

Một lưu ý về priority: nó cần một field Selection làm nền — mỗi lựa chọn là một mức sao. Ở đây 3 mức "Bình thường / Chú ý / Ưu tiên" cho 0 / 1 / 2 sao.

Cả ba trên một bảng

Đây là danh sách thẻ sau khi gắn widget:

Ảnh chụp giao diện Odoo thật, danh sách thẻ thành viên với cột Mức ưu tiên hiển thị các ngôi sao vàng và trắng khác nhau theo dòng, cột Hạng thẻ hiển thị nhãn màu cam ghi Vàng và các nhãn xanh ghi Bạc, cột Nhận tin khuyến mãi là công tắc trong đó ba cái bật màu xanh và một cái tắt màu xám, kèm các cột Mã thẻ Khách hàng Điểm Số dư Trạng thái

Hình 2: Ba widget cùng lúc. Sao (priority): VIP-0001 hai sao, VIP-0002/0004 một sao, VIP-0003 chưa có. Nhãn màu (badge): "Vàng" cam (decoration-warning), "Bạc" xanh (decoration-info). Công tắc (boolean_toggle): xanh là bật nhận tin, xám là tắt (VIP-0002). Bấm thẳng vào sao hay công tắc là đổi ngay, không cần mở form.

Điều khiến hai widget priority và boolean_toggle đặc biệt hữu ích: chúng ghi ngay khi bấm trên bảng. Nhân viên lướt danh sách, thấy khách nào cần chú ý thì click sao, khách nào xin ngừng nhận tin thì gạt tắt công tắc — không phải mở từng form. Đây là kiểu "sửa nhanh hàng loạt" mà bảng thường không có.

Tô màu badge có điều kiện

badge không tự biết màu — bạn chỉ dẫn bằng các thuộc tính decoration-*, mỗi cái là một điều kiện Python:

<field name="hang_the" widget="badge"
       decoration-info="hang_the == 'bac'"       <!-- xanh -->
       decoration-warning="hang_the == 'vang'"/> <!-- cam -->

Bốn màu ngữ nghĩa hay dùng: decoration-info (xanh dương), decoration-success (xanh lá), decoration-warning (cam), decoration-danger (đỏ). Điều kiện là biểu thức trên chính bản ghi, nên badge tự đổi màu theo dữ liệu — trạng thái "khoá" cho đỏ, "đang dùng" cho xanh, tuỳ bạn khai.

Chọn đúng widget

  • badge cho field phân loại ít giá trị mà bạn muốn đọc lướt bằng màu (hạng, trạng thái, mức độ). Đừng dùng cho field tự do nhiều giá trị — sẽ loạn màu.
  • priority cho một thang ưu tiên/đánh giá ngắn (sao). Nó nhấn mạnh việc bấm-nhanh; hợp cho cờ "quan trọng", "đánh dấu sao".
  • boolean_toggle cho cờ bật/tắt mà người dùng đổi thường xuyên (nhận tin, kích hoạt, hiển thị). Trực quan hơn ô tick, và bấm được ngay trên list.

Cả ba đều là widget hiển thị — không đổi dữ liệu lưu, chỉ đổi cách nhập và đọc. Bạn thay widget bất cứ lúc nào mà không phải migrate gì.

Ba ý mang về

  1. Model giữ nguyên (Selection, Boolean); widget lo phần hiển thị: badge → nhãn màu, priority → sao, boolean_toggle → công tắc.
  2. priority và boolean_toggle ghi ngay khi bấm trên bảng — sửa nhanh không cần mở form; badge tô màu theo decoration-info/success/warning/danger với điều kiện Python.
  3. Chọn widget theo bản chất field: phân loại đọc-bằng-màu → badge; thang ưu tiên ngắn → priority; cờ bật/tắt hay đổi → boolean_toggle.

Tới đây ta đã đi khá sâu vào widget. Bài sau chuyển sang một khả năng mạnh của field quan hệ: Phần sau về domain trên field — cách giới hạn động những bản ghi được phép chọn trong một Many2one/Many2many, theo giá trị của các field khác.