Trong các bài QWeb website vừa rồi ta in field bằng t-esc="the.diem" — và với số nguyên thì ổn. Nhưng thử t-esc một field tiền tệ: nó phun ra 1234.5, không ký hiệu tiền, không dấu phân tách. Một ngày thì ra 2026-09-17 thô. Một field selection thì ra mã kỹ thuật vang thay vì "Vàng". Odoo có một directive hiểu kiểu của field và tự lo định dạng: t-field.
t-field đọc kiểu field và định dạng theo đó
<span t-field="record.field"/> khác t-esc ở chỗ căn bản: nó không chỉ lấy giá trị, mà biết field đó thuộc kiểu gì (Monetary, Date, Selection, Html...) rồi định dạng cho đúng — dùng chính bộ formatter theo locale mà bài formatter/parser đã nói. Điều kiện: record phải là một bản ghi thật (browse ra), vì t-field cần đọc metadata của field.

Hình 1: Cùng field, hai directive. t-field định dạng theo kiểu: Monetary ra $ 1.234,50, Selection ra nhãn "Vàng", Date ra 17/09/2026. t-esc in thô: 1234.5, vang, 2026-09-17. Muốn tinh chỉnh, thêm t-options — ví dụ ép widget và chỉ định display_currency.
Thấy tận mắt: cùng bản ghi, hai cột
Mình dựng một trang web đặt t-field và t-esc cạnh nhau cho cùng thẻ VIP-0003:

Hình 2: Kết quả thật. Với Integer (diem), hai cột giống nhau — số thô đã đủ. Nhưng Monetary (so_du): t-field cho $ 1.234,50 (ký hiệu + dấu nghìn/thập phân theo locale), t-esc cho 1234.5. Selection (hang_the): t-field cho nhãn "Vàng", t-esc cho mã "vang". Date (ngay_cap): t-field cho 17/09/2026, t-esc cho ISO thô. Người đọc trang web cần cột trái, không phải cột phải.
Còn một khác biệt: sửa tại chỗ
t-field không chỉ để hiển thị đẹp. Trên website, khi người có quyền vào chế độ chỉnh sửa, các phần tử t-field trở thành sửa được ngay tại chỗ — bấm vào, gõ, lưu, dữ liệu ghi thẳng vào bản ghi. Đây là nền của tính năng "sửa nội dung trực tiếp trên trang" của Odoo website. t-esc/t-out chỉ in ra, không bao giờ sửa được.
Đổi lại, t-field "nặng" hơn: nó bọc giá trị trong thẻ HTML kèm thuộc tính metadata (để trình soạn thảo biết field nào, kiểu gì). Nên:
- Dùng
t-fieldkhi hiển thị một field của một bản ghi thật, cần định dạng đúng kiểu và/hoặc cho sửa tại chỗ. - Dùng
t-esc/t-outcho giá trị tính toán, chuỗi ghép, biến không phải field — những thứt-fieldkhông áp được (nó cần một field thật để đọc kiểu).
Vài lưu ý
t-fieldcần bản ghi thật.t-field="obj.x"vớiobjlà dict thường sẽ lỗi — phải là recordset đã browse.t-optionstinh chỉnh cách render:{"widget": "monetary", "display_currency": the.currency_id}cho tiền, hay đổi định dạng ngày. Monetary tự tìmcurrency_fieldcủa model, nhưng khaidisplay_currencycho chắc.t-fieldcũng escape nhưt-esc— an toàn XSS; field Html thì render HTML (đã được làm sạch), field text thì escape.
Ba ý mang về
t-field="record.field"đọc kiểu của field và định dạng theo đó — Monetary ra ký hiệu tiền + locale, Selection ra nhãn, Date ra định dạng ngày — kháct-escchỉ in giá trị thô. Cần một bản ghi thật làm nguồn.t-fieldcòn cho sửa tại chỗ trên website (khi có quyền + chế độ chỉnh sửa);t-esc/t-outchỉ hiển thị. Đổi lạit-fieldchỉ dùng được cho field của bản ghi, không cho giá trị tính toán.- Chọn theo nhu cầu: field thật cần định dạng/sửa →
t-field; giá trị ghép/tính/không phải field →t-esc/t-out. Tinh chỉnht-fieldbằngt-options.
Ta đã đi hết ba nhánh QWeb (OWL, report, website). Phần sau quay lại OWL với một kỹ thuật mạnh: slots — cho phép component cha "nhét" nội dung tuỳ ý vào những chỗ định sẵn của component con, giống khe 0 của QWeb nhưng cho component.