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>.

Lệnh odoo scaffold dựng khung module Odoo 19: cú pháp odoo scaffold tên module và thư mục đích, chạy bằng docker exec odoo19 odoo scaffold demo_scaffold vào thư mục tmp; kết quả sinh ra 10 file theo cây thư mục demo_scaffold gồm init.py nạp package models, manifest.py là tờ khai module, thư mục models chứa init.py và models.py là mẫu model đang comment sẵn, thư mục controllers chứa mẫu route HTTP, thư mục views chứa views.xml mẫu action menu và templates.xml mẫu QWeb website, thư mục security chứa file ir.model.access.csv, thư mục demo chứa demo.xml dữ liệu demo

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:

Nội dung thật scaffold sinh ra: file manifest.py là một dict Python với name demo_scaffold, summary mô tả ngắn, author My Company, category Uncategorized, version 0.1, depends là danh sách chứa base, data liệt kê views.xml và templates.xml còn dòng security ir.model.access.csv đang được comment, demo liệt kê demo.xml; file models/models.py chứa một class mẫu demo_scaffold kế thừa models.Model với _name, các trường name kiểu Char, value kiểu Integer, value2 kiểu Float có compute và store, và một hàm compute _value_pc dùng api.depends chia value cho 100, toàn bộ đang được comment bằng dấu thăng để bạn bỏ dấu và sửa

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?

  1. __manifest__.py: đổi name, summary, author, category, depends cho đúng. Bỏ comment dòng security.
  2. models/models.py: bỏ comment, đổi _name thành tên model thật (dạng module.doi_tuong), khai các trường.
  3. security/ir.model.access.csv: khai quyền cho model mới.
  4. Xoá phần không dùng: không làm website thì xoá controllers/ và templates.xml cho gọn.

Nhớ ba ý

  1. 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.
  2. 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.
  3. Sau scaffold nhớ bỏ comment dòng security trong manifest và khai ir.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.