Hai thứ nhỏ hay bị nhầm lẫn khi làm form Odoo. placeholder là dòng chữ xám mờ nằm trong một ô trống để gợi ý nên điền gì — nhìn giống dữ liệu nhưng không phải, gõ vào là nó biến mất. options là một cục JSON gắn sau field để tinh chỉnh cách một widget hoạt động — tô màu tag, cấm tạo bản ghi mới, đặt số chữ số thập phân... Bài này phân biệt rạch ròi hai thứ và cho xem chúng chạy thật.

placeholder: gợi ý, không phải giá trị

placeholder chỉ hiện khi ô trống. Nó không được lưu, không phải giá trị mặc định — chỉ là lời nhắc. Tôi gắn placeholder cho ô "ghi chú nội bộ" (chỉ hiện với thẻ Vàng) và cho cột ghi chú trong bảng lịch sử:

Ảnh chụp đoạn mã nền tối ba phần: phần placeholder gắn cho field ghi_chu_noi_bo với chữ Chỉ thẻ Vàng mới hiện ô này và cho field ghi_chu với chữ VD Mua 5 ly Đổi quà; phần options JSON đang chạy trên uu_dai_ids widget many2many_tags với color_field là color và no_create_edit True; phần options cho vài widget khác gồm so_du currency_field, ty_le widget percentage digits 16 2, và ngay datepicker warn_future; cuối ảnh ghi placeholder là gợi ý khi ô trống không phải giá trị lưu, options luôn là JSON điều chỉnh hành vi widget

Hình 1: placeholder là thuộc tính chuỗi, hiện chữ mờ khi ô trống. options luôn là JSON — khoá bọc nháy, true/false viết thường kiểu JSON. Mỗi widget nhận một bộ options riêng của nó.

Mở form một thẻ Vàng (VIP-0003), ô "Ghi chú nội bộ" đang trống nên hiện chữ mờ:

Ảnh chụp giao diện Odoo thật form thẻ VIP-0003 hạng Vàng, nhóm Thông tin thẻ có ô Ghi chú nội bộ đang trống hiển thị dòng chữ xám mờ Chỉ thẻ Vàng mới hiện ô này; phía trên là nhãn Chủ thẻ màu đỏ kèm dấu hỏi và ô trống viền đỏ vì bắt buộc; bên phải là Điểm tích luỹ 150 phần trăm, Hạng thẻ Vàng, Số dư và Tiền tệ

Hình 2: Ô "Ghi chú nội bộ" trống → hiện placeholder "Chỉ thẻ Vàng mới hiện ô này" bằng chữ xám mờ. Đây chỉ là gợi ý; ô vẫn rỗng, chưa có dữ liệu. Đối chiếu: "Chủ thẻ" viền đỏ vì bắt buộc mà chưa điền — đó là trạng thái khác hẳn placeholder.

Phân biệt cốt lõi: placeholder là chữ gợi ý trên nền ô rỗng, còn giá trị mặc định (như bài context trước) là dữ liệu thật đã điền. Placeholder biến mất ngay khi bạn gõ ký tự đầu tiên.

options: tinh chỉnh widget bằng JSON

Mỗi widget có những "núm vặn" riêng, khai qua options dạng JSON. Trên field uu_dai_ids (đang chạy), tôi bật hai option:

<field name="uu_dai_ids" widget="many2many_tags"
       options="{'color_field': 'color', 'no_create_edit': True}"/>
  • color_field: 'color' — lấy màu tag từ field color (đã thấy ở bài widget many2many).
  • no_create_edit: True — cấm tạo/sửa bản ghi ưu đãi mới ngay trên ô. Người dùng chỉ chọn trong danh mục có sẵn, không tự đẻ thêm.

Mỗi widget một bộ options khác nhau. Vài ví dụ hay gặp:

  • Monetary: {'currency_field': 'currency_id'} — chỉ định field tiền tệ.
  • Float/percentage: {'digits': [16, 2]} — số chữ số phần nguyên và thập phân.
  • many2one: {'no_open': True} — không cho mở bản ghi liên kết; {'no_quick_create': True} — tắt tạo nhanh.

Điểm dễ sai: options phải là JSON hợp lệ — khoá và chuỗi bọc trong nháy, true/false/null viết đúng kiểu JSON. Viết sai cú pháp là widget bỏ qua option (đôi khi không báo lỗi rõ), tính năng "im lặng" không chạy.

Đặt placeholder và options cho khéo

  • placeholder nên là ví dụ cụ thể, không lặp lại nhãn. "VD: Mua 5 ly, Đổi quà..." hữu ích hơn "Nhập ghi chú".
  • placeholder khác help: placeholder nằm trong ô và mất khi gõ; help (bài trước) là tooltip cạnh nhãn, luôn còn. Dùng placeholder cho gợi ý định dạng, help cho quy tắc.
  • Tra options của widget ở nguồn: mỗi widget định nghĩa options nó hiểu; đọc code widget (hoặc tài liệu) để biết núm nào có. Đừng đoán tên option.
  • options không đổi dữ liệu — như placeholder, chúng thuần tuý là lớp trình bày/tương tác.

Ba ý mang về

  1. placeholder là gợi ý mờ hiện khi ô trống, không phải giá trị lưu và biến mất khi gõ — khác hẳn giá trị mặc định (dữ liệu thật) và khác help (tooltip cạnh nhãn).
  2. options là JSON tinh chỉnh hành vi widget: color_field, no_create_edit cho tags; currency_field cho monetary; digits cho số... mỗi widget một bộ riêng.
  3. options phải đúng cú pháp JSON (khoá/chuỗi có nháy, true/false thường) — sai là option bị bỏ qua lặng lẽ; và như placeholder, nó không đụng dữ liệu.

Xong phần tinh chỉnh từng field. Bài sau lùi ra một bước để lo bố cục cả nhóm field: Phần sau về group với col và colspan — cách xếp field thành nhiều cột và cho một field chiếm rộng bao nhiêu cột trong form.