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

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

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ừ fieldcolor(đã 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ề
placeholderlà 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).optionslà JSON tinh chỉnh hành vi widget:color_field,no_create_editcho tags;currency_fieldcho monetary;digitscho số... mỗi widget một bộ riêng.optionsphải đúng cú pháp JSON (khoá/chuỗi có nháy,true/falsethườ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.