Đổi một website Odoo sang "giao diện quán cà phê" hay "giao diện spa" — cài một theme là cả site đổi màu, đổi font, đổi bố cục header/footer, nhất quán từ trang chủ tới trang sản phẩm. Điều thú vị: theme không phải một mớ file CSS ghi đè lộn xộn. Nó là một module khai màu/font qua một hệ biến SCSS có kỷ luật, để đổi một chỗ là cả site đổi theo. Bài này mổ xẻ cấu trúc cơ bản của một theme Odoo 19 — manifest, hệ biến màu, cơ chế "color combination" — và cho thấy nó áp lên toàn site ra sao.
Theme là một module đặc biệt
Điểm bất ngờ với người mới: theme cũng là một module như mọi module khác, chỉ khác vài chi tiết trong __manifest__. Đây là manifest thật của theme_default (theme mặc định của Odoo):

Hình 1: Manifest theme khác module thường ở ba điểm: 'category': 'Theme' (để nó hiện trong kho Theme, không lẫn với app), depends: ['website'], và 'images' — ảnh cover/screenshot hiện trong trình chọn theme. Nội dung theme nằm ở static/src/scss (màu/font), views/ (template header/footer, snippet), static/description (ảnh preview). Cài theme = cài module này.
Khai màu bằng hệ biến SCSS, không phải CSS thô
Đây là chỗ khác biệt lớn nhất với "tự viết CSS". Theme không ghi .btn { background: purple } khắp nơi. Nó khai vài biến SCSS trong một file primary_variables.scss, và toàn bộ giao diện tự lấy từ đó. Nhìn lõi thật của Odoo 19:

Hình 2: Hệ màu thật. $o-color-palettes là các bảng màu, mỗi bảng có o-color-1..5. $o-base-color-palette gán vai trò: menu: 1 (header dùng "color combination" o_cc1), footer: 2 (dùng o_cc2)... Nút primary lấy o-color-1. Đổi một palette là đổi o-color-1..5, và cả site đổi màu nhất quán vì mọi thứ tham chiếu về đó.
Color combination (o_cc1..o_cc5) là ý tưởng cốt lõi của Odoo 19: thay vì đặt màu cho từng phần tử, bạn định nghĩa 5 "tổ hợp màu" (mỗi tổ hợp gồm nền + chữ + tiêu đề + nút + link ăn khớp nhau), rồi gán mỗi vùng (header, footer, section) dùng tổ hợp nào. Nhờ đó đổi màu không bao giờ ra một trang "chỗ tím chỗ cam đá nhau".
Theme áp lên toàn site
Kết quả: cài theme (hoặc đổi palette), cả site khoác màu mới. Đây là site đang chạy với theme mặc định — màu chính #714B67:

Hình 3: Site thật với theme mặc định. Nút "Contact Us", thanh trượt giá, các nhấn nhá — tất cả dùng màu chính #714B67 (đo được từ nút: rgb(113,75,103)), font và bố cục cũng từ theme. Không có CSS rải rác; đổi o-color-1 trong palette là những chỗ này đổi theo.
Vài điều nên biết
- Chỉ một theme hoạt động mỗi lúc. Đổi theme là gỡ theme cũ, cài theme mới; dữ liệu (trang, sản phẩm) giữ nguyên, chỉ lớp giao diện đổi.
- Đừng ghi màu cứng. Trong snippet/template của bạn, dùng class color-combination (
o_cc1..o_cc5) hoặc biến SCSS, đừng gõ#714B67— để theme kiểm soát, đổi palette là bạn ăn theo. generate_primary_template.xmltrong theme_default gọi một hàm sinh các template snippet mặc định — theme không chỉ có màu mà còn khai bố cục/preset.- Người quản trị đổi màu không cần code: Website có bảng chọn palette và tùy chỉnh màu/font ngay trên trình soạn — đó chính là ghi đè các biến SCSS này.
Ba ý mang về
- Theme là một module đặc biệt:
manifestcócategory: 'Theme',depends: ['website'],imagescho trình chọn; nội dung ởstatic/src/scss(màu/font),views/(template),static/description(preview). Cài theme = cài module, đổi toàn site. - Màu/font khai bằng hệ biến SCSS:
$o-color-palettes(mỗi bảng cóo-color-1..5), và color combinationo_cc1..o_cc5gán tổ hợp màu cho từng vùng (menu, footer...) — đổi palette là cả site đổi nhất quán. - Đừng ghi màu cứng — dùng
o_cc*/biến SCSS trong snippet để ăn theo theme; người quản trị đổi palette/font ngay trên trình soạn website mà không cần sửa code.
Hết mảng website/theme, phần sau quay lại tầng thấp của controller: Phần sau mổ xẻ redirect và xử lý Werkzeug trong route — cách trả chuyển hướng đúng cách, làm việc với đối tượng request/response thô của Werkzeug, và những cạm bẫy khi tự dựng Response.