本章将指导你创建一个完整的 Odoo 自定义模块。

创建模块骨架

使用 Odoo 脚手架工具快速生成模块结构:

./odoo-bin scaffold my_module /path/to/custom-addons

或手动创建以下目录结构:

my_module/
├── __init__.py
├── __manifest__.py
├── models/
│   ├── __init__.py
│   └── my_model.py
├── views/
│   └── my_model_views.xml
└── security/
    └── ir.model.access.csv

manifest.py 配置

{
    'name': '我的自定义模块',
    'version': '1.0',
    'category': 'Custom',
    'summary': '模块功能简述',
    'description': '详细的模块功能描述',
    'depends': ['base', 'sale'],
    'data': [
        'security/ir.model.access.csv',
        'views/my_model_views.xml',
    ],
    'installable': True,
    'application': True,
    'license': 'LGPL-3',
}

定义模型

models/my_model.py 中定义数据模型:

from odoo import models, fields, api

class MyModel(models.Model):
    _name = 'my.module.model'
    _description = '自定义模型'

    name = fields.Char(string='名称', required=True)
    description = fields.Text(string='描述')
    date = fields.Date(string='日期', default=fields.Date.today)
    state = fields.Selection([
        ('draft', '草稿'),
        ('confirmed', '已确认'),
        ('done', '已完成'),
    ], string='状态', default='draft')
    partner_id = fields.Many2one('res.partner', string='客户')
    amount = fields.Monetary(string='金额', currency_field='currency_id')
    currency_id = fields.Many2one(
        'res.currency',
        default=lambda self: self.env.company.currency_id
    )

    def action_confirm(self):
        self.write({'state': 'confirmed'})

    def action_done(self):
        self.write({'state': 'done'})

创建视图

views/my_model_views.xml 中定义界面视图:

<?xml version="1.0" encoding="utf-8"?>
<odoo>
    <!-- 树视图 -->
    <record id="view_my_model_tree" model="ir.ui.view">
        <field name="name">my.module.model.tree</field>
        <field name="model">my.module.model</field>
        <field name="arch" type="xml">
            <tree>
                <field name="name"/>
                <field name="date"/>
                <field name="partner_id"/>
                <field name="amount"/>
                <field name="state" widget="badge"/>
            </tree>
        </field>
    </record>

    <!-- 表单视图 -->
    <record id="view_my_model_form" model="ir.ui.view">
        <field name="name">my.module.model.form</field>
        <field name="model">my.module.model</field>
        <field name="arch" type="xml">
            <form>
                <header>
                    <button name="action_confirm" type="object"
                            string="确认" class="btn-primary"
                            invisible="state != 'draft'"/>
                    <button name="action_done" type="object"
                            string="完成" class="btn-primary"
                            invisible="state != 'confirmed'"/>
                    <field name="state" widget="statusbar"/>
                </header>
                <sheet>
                    <group>
                        <field name="name"/>
                        <field name="partner_id"/>
                        <field name="date"/>
                        <field name="amount"/>
                        <field name="currency_id"/>
                    </group>
                    <field name="description" placeholder="输入描述..."/>
                </sheet>
            </form>
        </field>
    </record>

    <!-- 菜单项 -->
    <menuitem id="menu_my_module" name="我的模块"/>
    <menuitem id="menu_my_model" name="数据管理"
              parent="menu_my_module"
              action="action_my_model"/>
</odoo>

安装模块

重启 Odoo 并更新模块列表,然后在应用列表中搜索并安装你的模块:

./odoo-bin -c odoo.conf -u my_module -d my_database