Một field Many2many — ví dụ "các ưu đãi áp dụng cho thẻ" — có thể hiện ra theo vài cách rất khác nhau, và bạn chọn cách nào chỉ bằng thuộc tính widget. Cùng một uu_dai_ids, không đổi model, nhưng đặt widget="many2many_tags" thì ra những badge màu gọn gàng, đặt many2many_checkboxes thì ra một danh sách ô tick, còn không đặt gì thì ra một bảng con. Bài này đặt cả ba cạnh nhau trên cùng một form để thấy rõ khi nào nên dùng cái nào.

Ba cách hiển thị, một field

Ảnh chụp đoạn mã nền tối liệt kê ba cách khai field uu_dai_ids: cách mặc định bọc thẻ list với field name; cách many2many_tags kèm options color_field trỏ tới color và no_create True; cách many2many_checkboxes; cuối cùng là model UuDai với field name Char và field color Integer dùng cho color_field

Hình 1: Cùng field uu_dai_ids với ba widget. Mặc định (1) là bảng con. Tags (2) hiển thị badge, options bật màu qua color_field và chặn tạo mới bằng no_create. Checkboxes (3) là ô tick. Để tags có màu, model đích phải có một field Integer (ở đây color, giá trị 0–11 theo bảng màu Odoo).

Điểm mấu chốt Odoo 19: cả ba đều là một field trong dữ liệu — khác nhau thuần tuý ở lớp hiển thị. Người dùng chọn gì thì lưu nấy vào cùng bảng quan hệ.

Tags: gọn và có màu

Trên form thẻ, tôi để uu_dai_ids trong nhóm thông tin với widget="many2many_tags" và bật color_field:

Ảnh chụp giao diện Odoo thật, nhóm Điểm và số dư của form thẻ thành viên, dòng cuối Ưu đãi áp dụng hiển thị hai badge màu là Giảm 10 phần trăm đồ uống nền cam và Freeship nội thành nền xanh dương, mỗi badge có dấu nhân để gỡ

Hình 2: many2many_tags — mỗi ưu đãi là một badge có màu (lấy từ field color: cam = 2, xanh = 4). Bấm dấu × trên badge để gỡ; gõ vào ô để tìm và thêm. Kiểu này hợp khi danh mục mở và có thể dài (thẻ tag của khách hàng, kỹ năng, nhãn phân loại) — badge chiếm ít chỗ, đọc lướt nhanh.

many2many_tags là widget bạn gặp nhiều nhất: nhãn khách hàng, nhãn công việc, kỹ năng ứng viên. Nó tối ưu cho việc gõ-để-tìm trong một danh mục có thể lớn, và màu giúp phân loại bằng mắt.

Checkboxes: thấy hết để tick

Cũng field đó, trong tab "Ưu đãi" tôi đổi sang widget="many2many_checkboxes":

Ảnh chụp giao diện Odoo thật hiển thị ba ô tick xếp dọc, hai ô đầu Giảm 10 phần trăm đồ uống và Freeship nội thành được tích chọn màu tím, ô thứ ba Tặng bánh sinh nhật để trống chưa chọn

Hình 3: many2many_checkboxes — liệt kê toàn bộ lựa chọn có thể, tick cái nào là chọn cái đó. Ở đây thấy cả 3 ưu đãi, 2 cái đã chọn. Kiểu này hợp khi tập lựa chọn nhỏ và cố định (vài phương thức, vài quyền, vài tuỳ chọn) — người dùng thấy hết mọi khả năng trước mắt, không phải gõ tìm.

Điểm khác biệt cốt lõi: checkboxes phơi bày toàn bộ danh mục, còn tags thì giấu đi cho tới khi bạn gõ. Vì thế checkboxes chỉ hợp khi danh mục ngắn — mười mấy ưu đãi thì ổn, vài trăm sản phẩm thì thành một rừng ô tick.

Chọn widget theo bản chất dữ liệu

Widget Hợp khi Ví dụ
(mặc định) list Cần thấy nhiều cột của bản ghi liên quan Dòng đơn hàng, dòng chi tiết
many2many_tags Danh mục mở/dài, gõ để tìm, muốn màu Nhãn khách, kỹ năng, hashtag
many2many_checkboxes Tập nhỏ, cố định, muốn thấy hết Vài quyền, vài tuỳ chọn, vài dịch vụ kèm

Vài lưu ý khi dùng:

  • color_field cần field Integer trên model đích. Không có nó thì options={'color_field': 'color'} vô nghĩa — tags vẫn hiện nhưng không màu. Giá trị 0–11 ứng với bảng màu tag của Odoo.
  • no_create: True chặn tạo bản ghi mới ngay từ ô tags. Hữu ích khi danh mục phải do người quản trị định sẵn, không cho người nhập tuỳ tiện đẻ thêm.
  • checkboxes không có tìm kiếm. Nó luôn tải và vẽ mọi bản ghi của model đích — dùng cho model lớn là vừa chậm vừa rối.

Ba ý mang về

  1. Một field Many2many, đổi widget là đổi hẳn giao diện: mặc định (bảng con) → many2many_tags (badge) → many2many_checkboxes (ô tick). Dữ liệu lưu như nhau.
  2. Tags hợp danh mục mở và dài (gõ để tìm, badge gọn, có màu qua color_field + Integer trên model đích); checkboxes hợp tập nhỏ cố định (phơi hết lựa chọn, tick chọn, không tìm kiếm).
  3. Chọn widget theo bản chất dữ liệu, không theo thẩm mỹ: cần nhiều cột → list; danh mục mở → tags; tập ngắn cố định → checkboxes.

Tags và checkboxes lo phần chọn bản ghi. Bài sau ta chạm tới việc sắp xếp chúng: Phần sau về widget handle — cái tay nắm cho phép kéo–thả đổi thứ tự các dòng ngay trên giao diện.