本章将指导你创建一个完整的 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