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.

Ảnh chụp đoạn mã QWeb nền tối minh hoạ t-field so với t-esc. Chú thích the là record thật browse. Ba dòng t-field: span t-field the chấm so_du ra một chấm 234 phẩy 50 kèm ký hiệu đô la chú thích Monetary có ký hiệu và theo locale; span t-field the chấm hang_the ra Vàng chú thích Selection ra nhãn không phải vang; span t-field the chấm ngay_cap ra 17 xuyệt 09 xuyệt 2026 chú thích Date định dạng ngày. Rồi ba dòng t-esc in thô: so_du ra 1234.5, hang_the ra vang, ngay_cap ra 2026-09-17. Cuối cùng một ví dụ t-field kèm t-options widget monetary và display_currency là the chấm currency_id

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:

Ảnh chụp thật trang web so sánh trên Odoo 19, tiêu đề cốc cà phê t-field so với t-esc thẻ VIP-0003, một bảng ba cột Field kèm kiểu, cột t-field định dạng, cột t-esc thô. Dòng diem kiểu Integer cả hai cột đều 150. Dòng so_du kiểu Monetary cột t-field hiển thị đô la 1 chấm 234 phẩy 50 còn cột t-esc hiển thị 1234.5. Dòng hang_the kiểu Selection cột t-field hiển thị Vàng còn t-esc hiển thị vang. Dòng ngay_cap kiểu Date cột t-field hiển thị 17 xuyệt 09 xuyệt 2026 còn t-esc hiển thị 2026-09-17. Dưới bảng ghi cùng một field cùng một bản ghi chỉ khác cách hiển thị

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-field khi 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-out cho giá trị tính toán, chuỗi ghép, biến không phải field — những thứ t-field không áp được (nó cần một field thật để đọc kiểu).

Vài lưu ý

  • t-field cần bản ghi thật. t-field="obj.x" với obj là dict thường sẽ lỗi — phải là recordset đã browse.
  • t-options tinh 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ìm currency_field của model, nhưng khai display_currency cho chắc.
  • t-field cũ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ề

  1. 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ác t-esc chỉ in giá trị thô. Cần một bản ghi thật làm nguồn.
  2. t-field còn cho sửa tại chỗ trên website (khi có quyền + chế độ chỉnh sửa); t-esc/t-out chỉ hiển thị. Đổi lại t-field chỉ dùng được cho field của bản ghi, không cho giá trị tính toán.
  3. 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ỉnh t-field bằng t-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.