Tạo một module mới nghĩa là dựng 8–10 file theo đúng khuôn: __init__.py, __manifest__.py, thư mục models/, views/, security/... Gõ tay mỗi lần vừa chán vừa dễ sai. Odoo có sẵn một lệnh làm hết việc đó: odoo scaffold. Sau khi đã có quy trình Git, đây là cách bắt đầu một module mới cho nhanh.
Một dòng lệnh, cả bộ khung
Cú pháp cực đơn giản: odoo scaffold <tên_module> <thư_mục_đích>.

Hình 1: Kết quả thật của odoo scaffold demo_scaffold /tmp — 10 file phủ đủ mọi thành phần một module cần: tờ khai (__manifest__.py), model, controller, view, template QWeb, bảo mật, và dữ liệu demo. Bạn không phải nhớ file nào đặt ở đâu — scaffold đặt sẵn đúng chuẩn.
Nội dung sinh ra trông thế nào?
Scaffold không tạo file rỗng — nó điền sẵn nội dung mẫu. Đây là những gì thật sự nằm trong file:

Hình 2: Nội dung thật. __manifest__.py đã có đủ khung depends, data, demo — chỉ việc điền. models.py chứa một model mẫu được comment sẵn (có cả trường compute/store và một hàm @api.depends): bỏ dấu # là bạn có ngay một model chạy được để sửa, thay vì viết từ số 0.
Chú ý một điểm quan trọng ở manifest: dòng security/ir.model.access.csv trong data đang bị comment. Khi bạn bỏ comment model, phải mở lại dòng này — nếu không Odoo sẽ báo lỗi thiếu quyền truy cập cho model mới.
Quy trình dùng thực tế
# 1. Dựng khung vào thư mục addons của bạn
odoo scaffold quan_ly_kho /mnt/extra-addons
# 2. Bỏ comment model mẫu trong models/models.py, sửa tên & trường
# 3. Bỏ comment dòng security trong __manifest__.py, sửa ir.model.access.csv
# 4. Cập nhật danh sách phân hệ + cài module
odoo -d blog19 -i quan_ly_kho --stop-after-init
Trong môi trường Docker của loạt bài, tôi chạy docker exec odoo19 odoo scaffold ... rồi copy thư mục sinh ra vào addons_path.
Có template riêng không?
scaffold hỗ trợ -t <đường_dẫn_template> để dùng bộ khung tuỳ biến của bạn (ví dụ khung của công ty có sẵn header bản quyền, cấu trúc chuẩn nội bộ). Không truyền -t thì dùng template mặc định của Odoo như Hình 1–2.
odoo scaffold -t /opt/company-template ten_module /mnt/extra-addons
Nên sửa gì ngay sau scaffold?
__manifest__.py: đổiname,summary,author,category,dependscho đúng. Bỏ comment dòngsecurity.models/models.py: bỏ comment, đổi_namethành tên model thật (dạngmodule.doi_tuong), khai các trường.security/ir.model.access.csv: khai quyền cho model mới.- Xoá phần không dùng: không làm website thì xoá
controllers/vàtemplates.xmlcho gọn.
Nhớ ba ý
odoo scaffold <tên> <thư_mục>dựng sẵn cả bộ khung 10 file đúng chuẩn — khỏi gõ tay, khỏi nhớ file nào đặt đâu.- Nội dung sinh ra là mẫu được comment sẵn (model có
compute, manifest đủ khung) — bỏ dấu#và sửa, không viết từ số 0. - Sau scaffold nhớ bỏ comment dòng
securitytrong manifest và khaiir.model.access.csv, nếu không model mới sẽ lỗi thiếu quyền.
Khung có rồi, để code không xuống cấp theo thời gian ta cần công cụ tự kiểm tra chất lượng. Phần sau cài pre-commit + pylint-odoo — bắt lỗi và giữ code sạch tự động trước mỗi commit.