Odooカスタムモジュール作成の流れ(scaffold編)
🌸 目標
- Odoo(Docker環境)で
custom_sales_priorityというモジュールの雛形を作成する
1️⃣ 作業ディレクトリの確認
/home/User/test_environment/odoo18_project/
├── docker-compose.yml
├── addons/ (ローカル開発用フォルダ)
docker-compose.yml の volumes が以下のように設定されていることを確認:
services:
odoo:
volumes:
- ./addons:/mnt/extra-addons
✅ ローカルの ./addons が、コンテナ内の /mnt/extra-addons にマウントされます。
2️⃣ ローカルディレクトリの権限を確認・修正
Odooコンテナ内で書き込みできるよう、addons フォルダの権限を確認します:
ls -ld ./addons
権限変更
chmod -R 777 ./addons
# または(安全にUID指定)
sudo chown -R 1000:1000 ./addons
3️⃣ scaffold コマンドの実行
Odooコンテナに scaffold コマンドでモジュールを作成します。
✅ docker-compose を使う場合(Odooのサービス名が odoo の場合):
docker-compose exec odoo odoo scaffold custom_sales_priority /mnt/extra-addons
docker-compose exec odoo odoo scaffold custom_sales_priority /mnt/extra-addons
4️⃣ 結果確認
ローカルの addons ディレクトリに custom_sales_priority が作成されます:
odoo18_project/
├── addons/
│ └── custom_sales_priority/
│ ├── __init__.py
│ ├── __manifest__.py
│ ├── controllers/
│ ├── models/
│ ├── views/
│ ├── static/
│ ├── security/
│ ├── data/
│ └── tests/
5️⃣ Odooの再起動
モジュールを認識させるため、Odooを再起動します。
docker-compose restart odoo
6️⃣ 「アプリ」画面で確認
Odooにログインし、
「アプリ」 > 「アプリ一覧を更新」 > custom_sales_priority を検索 > インストール!
✅ まとめ
| ステップ | コマンド/操作 |
|---|---|
| 1️⃣ 権限確認 | ls -ld ./addons |
| 2️⃣ 権限修正(必要なら) | chmod -R 777 ./addons または chown -R 1000:1000 ./addons |
| 3️⃣ モジュール雛形作成 | docker-compose exec odoo odoo scaffold custom_sales_priority /mnt/extra-addons |
| 4️⃣ 確認 | ./addons/custom_sales_priority ができていること |
| 5️⃣ Odoo再起動 | docker-compose restart odoo |
| 6️⃣ Odooで確認 | 「アプリ」で検索・インストール |
変更例
販売画面の顧客の下にPriorityというフィールドを追加する
✅ 今見ている画面の説明(sale.orderのフォームビュー)
あなたが挙げたページの情報は、Odooのsale.orderモデルに基づいています。
このページは主に次の構成になっています:
- 基本情報エリア(上部)
- 顧客
- 請求先住所
- 配送先住所
- 支払条件
- 見積テンプレート
- 有効期限
- 価格表
- タブエリア(notebook)
- オーダ明細(Order Lines)
- オプションプロダクト
- 見積ビルダ
- その他情報
- プロダクト、税金(セクション)
- 金額合計
- 税抜金額、合計、税金、諸条件
✅ //sheet/notebook/page[@name='order_lines'] の意味
このパスは:
sheet→ フォーム全体の枠notebook→ タブ(オーダ明細などが含まれる)page[@name='order_lines']→ 「オーダ明細」のタブ
を指しています。
つまり、「オーダ明細」タブの直後に新しいタブを追加する という指定です。
✅ あなたの画面に「Priority」を追加するなら?
- 「顧客」の下に1つのフィールドを入れたい場合:
→//field[@name='partner_id']の例が良いです。 - 新しいタブ(例えば「優先度設定」など)を作りたい場合:
→//sheet/notebook/page[@name='order_lines']のように、タブの下に追加します。
✅ まとめ
| 目的 | XPath例 | UIの変化 |
|---|---|---|
| 顧客の下に新しいフィールド | //field[@name='partner_id'] | 「顧客」の下に新しい項目(例: Priority)が表示される |
| オーダ明細の後に新しいタブを追加 | //sheet/notebook/page[@name='order_lines'] | 「オーダ明細」の横に新しいタブが出現する |
| その他情報の下に追加 | //page[@name='other_information'] | 「その他情報」タブの後に新しいタブが出現する |
カスタマイズ例:販売・見積画面でPriorityフィールドを追加する

📄 models/custom_sale_order.py
from odoo import models, fields, api
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_priority = fields.Selection([
('low', 'Low'),
('medium', 'Medium'),
('high', 'High'),
], string='Priority', default='medium', help='Priority of the sales order')
@api.model
def create(self, vals):
if 'priority' in vals:
vals['x_priority'] = vals.pop('priority')
return super(SaleOrder, self).create(vals)
📄 views/sale_order_views.xml
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_order_form_inherit_priority" model="ir.ui.view">
<field name="name">sale.order.form.priority</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='partner_id']" position="after">
<field name="x_priority"/>
</xpath>
</field>
</record>
</odoo>
📄 __manifest__.py(モジュールの定義ファイル)
{
'name': 'Custom Sales Priority',
'version': '1.0',
'depends': ['sale'],
'author': 'Your Name',
'category': 'Sales',
'summary': 'Add Priority Field to Sales Order',
'description': 'This module adds a custom priority field to sales orders.',
'data': [
'views/sale_order_views.xml',
],
'installable': True,
'application': False,
}
📄 __init__.py(モジュールの初期化ファイル)
from . import models
5️⃣ Odooの再起動とインストール
- Odoo再起動(または
docker-compose restart odoo) - 開発者モードにして、「アプリ一覧の更新」
- 「アプリ」画面で 「Custom Sales Priority」 を検索してインストール
- インストール後、
Sales Orderの画面にPriorityフィールドが表示されることを確認
custom_sales_priority/
├── __init__.py
├── __manifest__.py
├── models/
│ ├── __init__.py
│ └── custom_sale_order.py
└── views/
└── sale_order_views.xml
※ 権限を修正
chmod -R 777 ./addons
ファイルの変更が権限によりできない場合
sudo chown -R kenji:kenji addons/
✅ まとめ
| ステップ | コマンド/操作 |
|---|---|
| 1️⃣ 権限確認 | ls -ld ./addons |
| 2️⃣ 権限修正(必要なら) | chmod -R 777 ./addons または chown -R 1000:1000 ./addons |
| 3️⃣ モジュール雛形作成 | docker-compose exec odoo odoo scaffold custom_sales_priority /mnt/extra-addons |
| 4️⃣ 確認 | ./addons/custom_sales_priority ができていること |
| 5️⃣ Odoo再起動 | docker-compose restart odoo |
| 6️⃣ Odooで確認 | 「アプリ」で検索・インストール |
※ 追加したフィールドは自動でDBのフィールドのに追加される
PgadminでDBを参照する場合、docker-compose.ymlを変更 Portの追加
services:
db:
image: postgres:15
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=odoo
- POSTGRES_PASSWORD=odoo
volumes:
- odoo-db-data:/var/lib/postgresql/data
ports:
- "5432:5432" # ← この行を追加
| 項目 | 設定例 |
|---|---|
| Host name/address | localhost または 127.0.0.1 |
| Port | 5432 |
| Username | odoo |
| Password | odoo |
| Database | postgres または Odooが使用しているDB名(必要に応じて) |
サービスを再起動
docker-compose up -d
コメントを残す