《Odoo90模块开发全流程.docx》由会员分享,可在线阅读,更多相关《Odoo90模块开发全流程.docx(76页珍藏版)》请在三一办公上搜索。
1、构建Odoo模块模块组成o 业务对象业务对象声明为Python类, 由Odoo自动载入.o 数据文件XML或CSV文件格式, 在其中声明了元数据(视图或工作流)、配置数据(模块参数)、演示数据等.o Web控制器处理Web浏览器发来的requests.o 静态web数据Web用到的图像, CSS或JavaScript文件.模块结构一个Odoo模块也是一个Python模块, 存放在一个目录中, 包含一个_init_.py文件, 用于导入其他Python模块.from . import mymoduleodoo.py提供了一个子命令scaffold可以方便地创建一个空的模块.$ odoo.py s
2、caffold 命令执行后, 将会创建一个子目录并且其中包括了Odoo模块所需的一些基本文件.练习 #1执行 ./odoo.py scaffold openacademy addons, 在addons目录下创建一个名为openacademy的模块, 生成的目录文件结构如下.openacademy _init_.py _openerp_.py controllers.py demo.xml models.py security ir.model.access.csv templates.xml各文件内容请查看文件或查看原文, 然后对_openerp_.py中的几种标识文本进行修改,至少需要添加
3、installable:True, application:True。对象关系映射ORM层是Odoo的一个关键组件, 它可以避免大部分的SQL语句编写从而提高扩展性和安全性.业务对象用派生自Model的Python类(模型)来编写, 该类的_name属性定义了模型在Odoo系统中的名称.from openerp import modelsclass MinimalModel(models.Model): _name = test.model字段字段定义模型能够存储什么以及在哪里存储, 字段在模型类中用属性来定义.from openerp import models, fieldsclass L
4、essMinimalModel(models.Model): _name = test.model2 name = fields.Char()通用属性与模型类似, 字段也可以通过参数传递对其进行设定:name = field.Char(required=True)字段的常用属性有:o string (unicode, default: fields name)字段标签名称,会显示在界面上(对用户可见)。o required (bool, default: False)如果值为True,此字段值不能为空,设置默认值或者在创建记录时提供。o help (unicode, default: )界面上
5、显示提示语。o index (bool, default: False)如果值为True,创建表时将为此列添加索引。简单字段字段可以分为两类: 简单字段和关系字段. 前者为原子值, 直接保存在模型对应的数据库表中; 后者连接到其他的记录上(可以是相同的模型也可以是不同的模型).Boolean, Date, Char这些都是简单字段.保留字段Odoo在模型中自动创建并维护一些字段, 这些字段就是保留字段, 这些字段数据不需要也不应该手动去修改.o id (Id)一条记录的唯一id。o create_date (Datetime)记录创建时间。o create_uid (Many2one)谁创建的
6、记录。o write_date (Datetime)最后修改时间。o write_uid (Many2one)谁最后修改的记录。特殊字段默认情况下, Odoo要求模型中有一个name字段, 用于显示和搜索, 通过设置_rec_name也可以达到这样的目的.练习 #2在openacademy模块中定义一个新的模型Course, openacademy/models.py内容如下:# -*- coding: utf-8 -*-from openerp import models, fields, apiclass Course(models.Model): _name = openacademy.
7、course name = fields.Char(string=Title, required=True) description = fields.Text()数据文件Odoo是一个高度数据驱动的系统, 虽然使用Python代码来定制模块行为, 但很多模块数据是在其载入时setup的, 并且有些模块仅仅为Odoo添加数据.通过数据文件来定义模块数据, 例如可以使用XML文件中的元素定义数据, 每一个元素创建或者更新数据库中的一条记录, 形式如下: a value o modelOdoo模型名.o id外部ID(External Identifier), 通过它可以引用到记录(并且不需要知道
8、记录所在的数据库ID).o 元素name属性用于确定字段名称(例如description), 该元素的body给出字段的值.数据文件必须在模块载入清单文件列表中, 也就是_openerp_.py的data列表(全部载入)或demo列表(只有设定为载入演示数据才会载入)中.练习 #3创建一个数据文件来向Course中添加数据, 编辑openacademy/demo.xml, 并确认_openerp_.py的demo列表中有该文件. Course 0 Course 0s descriptionCan have multiple lines Course 1 Course 2 Course 2s d
9、escription 动作和菜单在Odoo中, 动作和菜单都是定义在数据库中的数据记录, 一般通过数据文件来定义.动作可以由三种方式触发:o 点击菜单项(菜单项链接到特定动作)o 点击视图上的按钮(如果按钮连接到动作)o 作为对象的上下文动作使用声明一个ir.ui.menu并将其连接到一个action, 可以用下面的形式的代码. Ideas idea.idea tree,form注意: action必须先于menu的连接使用定义, 数据文件在载入时顺序地执行, 所以动作的ID必须首先存在于数据库中才能使用.练习 #4定义一个新的菜单项访问OpenAcademy课程.创建openacademy/
10、views/openacademy.xml文件, 并在其中添加动作和菜单. Courses openacademy.course form tree,form Create the first course 在_openerp_.py中添加这个数据文件名到data.data: # security/ir.model.access.csv, templates.xml, views/openacademy.xml, ,更新模块后可以看到菜单, 操作看看效果.基本视图视图定义了模型数据如何显示, 每种类型的视图代表一种数据可视化模式.基本的视图定义一个视图是以一条ir.ui.view模型数据的形式
11、定义的. view.name object_name !- view content: , , , . - Tree viewsTree view也被称为list views, 在一个表格中显示记录. 根元素是, 最简形式的tree view只是简单地列出每条记录的多个字段, 每个字段为一列. Form viewsForm用于创建或编辑单条记录, 根元素是, 可以在form中组合各种高层结构元素(如groups, notebooks)以及交互元素(如buttons, fields). 练习 #5为openacademy创建form view, views/openacademy.xml数据文件
12、中增加内容. course.form openacademy.course !- The following tag is an action definition for a window action,更新模块, 创建一个Course, 可以看到form view变了.练习 #6使用notebook. 在form view中, 将description字段放在一个tab中, 方便随后添加其他tabs, 对练习#5的form view数据做如下修改. This is an example of notebooks 更新模块, 看效果.More还可以使用HTML为form view提供更加灵活
13、的布局, 例如下面的例子. Search viewsSearch views用来自定义list views及其它统计/多条记录视图中的搜索字段. 根元素为, 其子元素定义了在哪些字段上进行搜索. 如果一个模型没有定义对应的Search view, odoo自动创建一个仅搜索name字段的search view.练习 #7添加title以及description搜索, 在views/openacademy.xml中定义search view. course.search openacademy.course !- The following tag is an action definition
14、 for a window action,更新模块, 搜索框输入字符后可以看到下方能够选择搜索description字段.模型中的关联概述一个模型中的记录可能关联到其他模型的记录, 例如销售订单记录会关联到一个包含客户信息的客户记录.练习 #8为了说明数据关联, 首先增加新的模型.Open Academy模块中, 一个session是一个在特定时间针对特定听众讲授课程的过程. 需要为session创建相应的模型.session具有name, 开始日期, 持续时间以及座位数量等. 此外还需要添加相应的action和menuitem显示模型数据.首先在openacademy/models.py中创
15、建Session类.class Session(models.Model): _name = openacademy.session name = fields.Char(required=True) start_date = fields.Date() duration = fields.Float(digits=(6, 2), help=Duration in days) seats = fields.Integer(string=Number of seats)然后在openacademy/view/openacademy.xml中添加用于访问session模型的action和menui
16、tem定义. session.form openacademy.session Sessions openacademy.session form tree,form digits=(6,2)确定浮点数的精度, 6表示总的数字位数(不包括小数点), 2表示小数点后的位数. 所以, digits=(6,2)小数点前最多4位.关联字段关联字段指向某些记录,或者是相同的model(模型),或者是不同的model(模型)。关联字段类型:Many2one(other_model, ondelete=set null)One2many(other_model, related_field)Many2man
17、y(other_model)练习 #9概述 使用many2one修改Course和Session模型(model),反映出与其他模型(model)的关联: 每个Course有一个负责人,other_model值为res.users 每个Session有一个老师,other_model值为res.partner 一个Session关联一个Course,other_model值为openacademy.course,必填 调整view。1. 添加相关字段Many2One到model2. 添加到viewopenacademy/models.py name = fields.Char(string=T
18、itle, required=True) description = fields.Text() responsible_id = fields.Many2one(res.users, ondelete=set null, string=Responsible, index=True)class Session(models.Model): _name = openacademy.session start_date = fields.Date() duration = fields.Float(digits=(6, 2), help=Duration in days) seats = fie
19、lds.Integer(string=Number of seats) instructor_id = fields.Many2one(res.partner, string=Instructor) course_id = fields.Many2one(openacademy.course, ondelete=cascade, string=Course, required=True)openacademy/views/openacademy.xml course.tree openacademy.course !- The following tag is an action definition for a window action, field name=seat