Odoo开发入门第一课,从自定义一个APP应用模块开始(假设已下载源码配置好开发环境)。学习这个知识点后帮助理解Odoo的MVC结构,对源码结构有个初步认识,更容易理解前台配置过程、选项。
效果预览:
1、创建快框架:
终端使用命令 odoo-bin scaffold
1$ ./odoo-bin scaffold jwerp_module ./addons/
2、配置__manifest__.py文件:
1# -*- coding: utf-8 -*-
2{
3 'name': "jwerp_module",
4 'summary': """ 5 Short (1 phrase/line) summary of the module's purpose, used as 6 subtitle on modules listing or apps.openerp.com""",
7 'description': """ 8 Long description of module's purpose 9 """,
10 'author': "My Company",
11 'website': "http://www.yourcompany.com",
12
13 # Categories can be used to filter modules in modules listing
14 # Check https://github.com/odoo/odoo/blob/14.0/odoo/addons/base/data/ir_module_category_data.xml
15 # for the full list
16 'category': 'Uncategorized',
17 'version': '0.1',
18
19 # any module necessary for this one to work correctly
20 # 依赖模块
21 'depends': ['base'],
22
23 # always loaded
24 'data': [
25 'security/ir.model.access.csv',
26 'views/teacher_views.xml',
27 'views/views.xml',
28 'views/templates.xml',
29 ],
30 # only loaded in demonstration mode
31 'demo': [
32 'demo/demo.xml',
33 ],
34 # 默认创建模板没有这三项
35 'installable': True,
36 'application': True,
37 'auto_install': False
38}
然后,重启服务>应用>刷新本地模块列表
可看到应用列表多了自定义模块图标
3、models文件夹下新建teacher_data.py
Python类,类属性_name表示模型名称jwerp_module.teacher,以点号. 命名规则。Odoo的ORM引擎启动时会在数据库创建对应的实例对象jwerp_module_teacher,名称以下划线代替点号。
ORM引擎的fields模型字段的选项有:
index:是否索引
required:是否必填
readonly:是否只读
default: 默认值
compute: 计算列,引用函数名
其他暂不展开说
1from odoo import models, fields, api
2
3class Teacher(models.Model):
4 _name = 'jwerp_module.teacher'
5 _description = "JwERP/Teacher"
6
7 name = fields.Char("名字", index=True, required = True, )
8 age = fields.Integer(string='Age')
9
10 _sql_constraints = [('name_unique', 'unique(name)', 'A Name can only have one Teacher.')]
数据的ID列,一般无需我们定义,Odoo的ORM引擎会自动创建id列及几个内置字段。
模型字段约束有两种方法,一种是给_sql_constraints属性赋值,会在数据表实例添加约束;
另一种就是上面说到的计算列compute对应的函数,在代码层面进行约束。
1 value = fields.Integer()
2 value2 = fields.Float(compute="_value_pc", store=True)
3 description = fields.Text()
4
5 @api.depends('value')
6 def _value_pc(self):
7 for record in self:
8 record.value2 = float(record.value) / 100
注意通过前台的‘技术’>'模型约束' 创建的约束只保存在数据库表ir_model_constraint里,实例数据表没有修改生效。
4.定义菜单、视图、动作文件 teacher_views.xml
1 2 3 4 "ir.ui.view" id="jwerp_module.list"> 5 "name">jwerp_module list 6 "model">jwerp_module.teacher 7 "arch" type="xml"> 8 9 "name"/>10 "age"/>11 12 13 1415 16 "ir.actions.act_window" id="jwerp_module.action_window">17 "name">教师18 19 "res_model">jwerp_module.teacher20 "view_mode">tree,form,kanban21 2223 243839 4041 "JWERP" id="jwerp_module.menu_root"/>4243 4445 "Teachers" id="jwerp_module.menu_teacher" parent="jwerp_module.menu_root"/>46 "Students" id="jwerp_module.menu_student" parent="jwerp_module.menu_root"/>4748 4950 "Teacher List" id="jwerp_module.menu_teacher_list" parent="jwerp_module.menu_teacher"51 action="jwerp_module.action_window"/>52 "Server to list" id="jwerp_module." parent="jwerp_module.menu_student"53 action="jwerp_module.action_window"/>5455 56
adction 父类有:
ir.actions.act_window
ir.actions.client
ir.actions.server
ir.actions.report
ir.actions.act_url
"view_mode" 表示有几种视图形式,需自定义各种视图,
,,,,,5、配置权限文件security/ir.model.access.csv
1 id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
2access_jwerp_module_teacher,jwerp_module.teacher,model_jwerp_module_teacher,base.group_user,1,1,1,1
修改__manifest__.py文件,增加内容
1# always loaded
2'data': [
3 'security/ir.model.access.csv',
4 'views/teacher_views.xml',
5 'views/views.xml',
6 'views/templates.xml',
7]
小结:
每次修改代码后,需重启服务,模块‘升级’。odoo的模块结构分层清晰,有view视图层、model模型层,controllers控制层,ORM则引擎无需开发人员重复写CURD。
自定义菜单、模型、视图,其实都可以前台0代码配置,这也是odoo高可定制的方面,但前台配置的只存在数据库记录,没有源码文件,不利于知识转移。前台配置一般适用于实施人员或小功能应用。
Odoo14 免注册 体验地址