模块的创建
快速创建一个模块,最简的目录
module_name
├─ __init__.py
├─ __manifest__.py
├─ models
│ ├─ __init__.py
│ └─ models.py
├─ security
│ └─ ir.model.access.csv
└─ views
└─ views.xml
方法一,通过脚手架scaffold 创建
1、首先进入终端 可以使用cmd命令行进入 我这里直接从pycharm进入
2、要进入到和odoo-bin同一个目录
3、命令 python odoo-bin scaffold <module_name> <path_to_target_dir>
<module_name>
:替换为你想要创建的模块的名称,例如"my_module"。<path_to_target_dir>
:替换为你希望在其中创建模块的目标目录的路径。
方法二,可以直接复制模块或创建空文件目录(注意模块&模型的唯一性)
我这里使用方法一创建的模块,模块在addons里面
controllers:网站控制器,定义web访问的返回,也常用于IoT
demo:带演示数据的数据文件,可用于测试、培训或模块评测
models:代码核心,包含我们的各种模型
security:权限控制目录
views:视图文件目录。决定models目录下model的前端界面呈现
__manifest__.py
ir.model.access.csv
第一行为格式,第二行为test2 model的权限设置
创建好之后就可以直接重新启动服务,登录进去就能看见了
模型
在Xodoo中,一切皆模型。Xodoo将各种数据安装模型分表存储,在查看时,按照索引从各个表格读取信息,组合成我们看到的内容
模型的属性
模型内置属性:可以使用一些内置属性来定义模型的一些特征:
_name:创建Xodoo模型的内部标识符,必含项。
_description:当用户界面显示模型时,一个方便用户的模型记录标题。
_rec_name:用来指出引用关联字描述记录的字段,例如多对一关系。默认情况下,它使用name字段,这是模型中常见的字段。但是这个属性允许我们使用任何其他字段来实现这个目的。
_inherit:继承。
_inherits:委托继承。
模型对象的获取
Xodoo模型被保存在一个中央注册中心,它可以引用实例中可用的所有模型类,并且它可以被一个模型名引用。在我们编写的模型方法代码中,可以通过 self.env['x'] 获取一个代表model x的类的引用。(相当于spring托管对象)
模型名称很重要,因为它们是用于访问注册中心的。模型名称的约定规则:用点分隔的小写字母列表。
模型名称必须是全局唯一,通常与模块名相关。
Xodoo中的三种模型
1. 基本模型models.Model
绝大多数Xodoo模型中,类都是基于models.Model类的。 这种类型的模型具有永久的数据库持久性:为它们创建数据库表,并且它们的记录被存储,直到被显式删除。
2. 瞬态模型models.TransientModel
通常用于向导(wizard)。 它们的数据仍然存储在数据库中,但是临时的,一个清理作业定期从这些表中清除旧数据。
3. 抽象模型models.AbstractModel
不存储数据,不会在数据库创建表。 抽象模型作为可重用的功能集,利用Xodoo的继承功能,混入到其他模型。通常用于定义接口或者用作报表模型。
本教程首先熟悉第一种基本模型。
模型之间的关系
常通过关系字段(Many2one、One2many、Many2many)建立模型关系。命名字段时,有以下约定:以_id、_ids为结尾命名的字段,分别对应的是Many2one和One2many的关系。
视图文件结构
views文件夹中xml文件内容通常包含菜单(menuitem)、动作(action)和视图板块(tree、form、search、gantt等)。最简结构如下:
<?xml version="1.0" encoding="utf-8" ?>
<Xodoo>
<data>
<!--tree 视图-->
<record id="Xodoo_tree_test_test" model="ir.ui.view">
<field name="name">test.test.tree</field>
<field name="model">test.test</field>
<field name="arch" type="xml">
<tree string="列表">
<field name="name"/>
<field name="description"/>
</tree>
</field>
</record>
<!--form 视图-->
<record id="Xodoo_form_test_test" model="ir.ui.view">
<field name="name">test.test.form</field>
<field name="model">test.test</field>
<field name="arch" type="xml">
<form string="表单">
<field name="name"/>
<field name="description"/>
</form>
</field>
</record>
<!--action 动作-->
<record model="ir.actions.act_window" id="test_action">
<field name="name">测试</field>
<field name="res_model">test.test</field>
<field name="view_mode">tree,form</field>
</record>
<!--菜单,引用action-->
<menuitem name="我的测试" id="main_test_menu" action="test_action" sequence="1"/>
</data>
</Xodoo>
菜单
在前端界面上显示为顶部主菜单栏,可以是多层级
比如:
<!-- 一级菜单 -->
<menuitem id="main_openacademy_menu" name="Open Academy"/>
<!-- 二级菜单 -->
<menuitem id="openacademy_menu" name="Open Academy" parent="main_openacademy_menu"/>
<!-- 三级菜单,并且有action -->
<menuitem id="courses_menu" name="Courses" parent="openacademy_menu" action="course_list_action"/>
每一个菜单都可以触发动作:使用参数action="action_id"
在前端界面上是:
动作
action通过ir.actions.act_window这个模型去创建,触发动作后会跳到视图,使用哪些视图需要写明,比如下面action里添加了列表视图、表单、日历、甘特、图表、看板视图。
<record model="ir.actions.act_window" id="session_list_action">
<field name="name">Sessions</field>
<field name="res_model">openacademy.session</field>
<field name="view_mode">tree,form,calendar,gantt,graph,kanban</field>
</record>
*在Xodoo中,排序是很重要的。整个action这段代码一般放在所有menuitem之前,而具体视图代码块放在action之前。
基本视图
Xodoo支持多样化的视图表现,初级开发者可以定义每一种视图块中具体的字段展示样式,包括小部件(widget)。
视图都通过模型ir.ui.view创建。
最常用的是:
tree视图示例:
<record id="Xodoo_tree_test_test" model="ir.ui.view">
<field name="name">test.test.tree</field>
<field name="model">test.test</field>
<field name="priority">1</field>
<field name="arch" type="xml">
<tree string="列表">
<field name="name"/>
<field name="description"/>
</tree>
</field>
</record>
如上,通常包括:
- 元素头<record>
- 规定格式字段name、model等
- tree视图具体内容
form视图示例:
<record id="form_hr_eval" model="ir.ui.view">
<field name="name">hr.eval.form</field>
<field name="model">hr.eval</field>
<field name="arch" type="xml">
<form string="表单">
<sheet>
<div class="oe_button_box" name="button_box">
</div>
<group>
<group>
<field name="name" />
<field name="job" />
<field name="user_id" />
<field name="department_type" options="{'horizontal': true}" widget="radio" />
</group>
<!--两组group可实现分页的作用-->
<group>
<field name="date_start"/>
<field name="date_end"/>
<field name="score"/>
<field name="rank"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
如上,通常包括:
- 元素头<record>
- 规定格式字段name、model等
- form视图具体内容,也常用notebook、div、group等。