构建Odoo模块教程.docx
《构建Odoo模块教程.docx》由会员分享,可在线阅读,更多相关《构建Odoo模块教程.docx(82页珍藏版)》请在冰豆网上搜索。
构建Odoo模块教程
构建Odoo模块
模块组成
o业务对象
业务对象声明为Python类,由Odoo自动载入.
o数据文件
XML或CSV文件格式,在其中声明了元数据(视图或工作流)、配置数据(模块参数)、演示数据等.
oWeb控制器
处理Web浏览器发来的requests.
o静态web数据
Web用到的图像,CSS或JavaScript文件.
模块结构
一个Odoo模块也是一个Python模块,存放在一个目录中,包含一个__init__.py文件,用于导入其他Python模块.
from.importmymodule
odoo.py提供了一个子命令scaffold可以方便地创建一个空的模块.
$odoo.pyscaffold
命令执行后,将会创建一个子目录并且其中包括了Odoo模块所需的一些基本文件.
练习#1
执行./odoo.pyscaffoldopenacademyaddons,在addons目录下创建一个名为openacademy的模块,生成的目录文件结构如下.
openacademy
├──__init__.py
├──__openerp__.py
├──controllers.py
├──demo.xml
├──models.py
├──security
│└──ir.model.access.csv
└──templates.xml
各文件容请查看文件或查看原文,然后对__openerp__.py中的几种标识文本进行修改,
至少需要添加'installable':
True,'application':
True。
对象关系映射
ORM层是Odoo的一个关键组件,它可以避免大部分的SQL语句编写从而提高扩展性和安全性.
业务对象用派生自Model的Python类(模型)来编写,该类的_name属性定义了模型在Odoo系统中的名称.
fromopenerpimportmodels
classMinimalModel(models.Model):
_name='test.model'
字段
字段定义模型能够存储什么以及在哪里存储,字段在模型类中用属性来定义.
fromopenerpimportmodels,fields
classLessMinimalModel(models.Model):
_name='test.model2'
name=fields.Char()
通用属性
与模型类似,字段也可以通过参数传递对其进行设定:
name=field.Char(required=True)
字段的常用属性有:
ostring(unicode,default:
field’sname)
字段标签名称,会显示在界面上(对用户可见)。
orequired(bool,default:
False)
如果值为True,此字段值不能为空,设置默认值或者在创建记录时提供。
ohelp(unicode,default:
‘’)
界面上显示提示语。
oindex(bool,default:
False)
如果值为True,创建表时将为此列添加索引。
简单字段
字段可以分为两类:
简单字段和关系字段.前者为原子值,直接保存在模型对应的数据库表中;后者连接到其他的记录上(可以是相同的模型也可以是不同的模型).
Boolean,Date,Char这些都是简单字段.
保留字段
Odoo在模型中自动创建并维护一些字段,这些字段就是保留字段,这些字段数据不需要也不应该手动去修改.
oid(Id)
一条记录的唯一id。
ocreate_date(Datetime)
记录创建时间。
ocreate_uid(Many2one)
谁创建的记录。
owrite_date(Datetime)
最后修改时间。
owrite_uid(Many2one)
谁最后修改的记录。
特殊字段
默认情况下,Odoo要求模型中有一个name字段,用于显示和搜索,通过设置_rec_name也可以达到这样的目的.
练习#2
在openacademy模块中定义一个新的模型Course,openacademy/models.py容如下:
#-*-coding:
utf-8-*-
fromopenerpimportmodels,fields,api
classCourse(models.Model):
_name='openacademy.course'
name=fields.Char(string="Title",required=True)
description=fields.Text()
数据文件
Odoo是一个高度数据驱动的系统,虽然使用Python代码来定制模块行为,但很多模块数据是在其载入时setup的,并且有些模块仅仅为Odoo添加数据.
通过数据文件来定义模块数据,例如可以使用XML文件中的元素定义数据,每一个元素创建或者更新数据库中的一条记录,形式如下:
{avalue}
omodel
Odoo模型名.
oid
外部ID(ExternalIdentifier),通过它可以引用到记录(并且不需要知道记录所在的数据库ID).
o元素
name属性用于确定字段名称(例如description),该元素的body给出字段的值.
数据文件必须在模块载入清单文件列表中,也就是__openerp__.py的’data’列表(全部载入)或’demo’列表(只有设定为载入演示数据才会载入)中.
练习#3
创建一个数据文件来向Course中添加数据,编辑openacademy/demo.xml,并确认__openerp__.py的’demo’列表中有该文件.
Course0
Course0'sdescription
Canhavemultiplelines
Course1
--nodescriptionforthisone-->
Course2
Course2'sdescription
动作和菜单
在Odoo中,动作和菜单都是定义在数据库中的数据记录,一般通过数据文件来定义.
动作可以由三种方式触发:
o点击菜单项(菜单项到特定动作)
o点击视图上的按钮(如果按钮连接到动作)
o作为对象的上下文动作
使用
Ideas
idea.idea
tree,form
action="action_list_ideas"/>
注意:
action必须先于menu的连接使用定义,数据文件在载入时顺序地执行,所以动作的ID必须首先存在于数据库中才能使用.
练习#4
定义一个新的菜单项访问OpenAcademy课程.
创建openacademy/views/openacademy.xml文件,并在其中添加动作和菜单.
xmlversion="1.0"encoding="UTF-8"?
>
--windowaction-->
--
Thefollowingtagisanactiondefinitionfora"windowaction",
thatisanactionopeningavieworasetofviews
-->
Courses
openacademy.course
form
tree,form
Createthefirstcourse
--toplevelmenu:
noparent-->
--Afirstlevelintheleftsidemenuisneeded
beforeusingaction=attribute-->
parent="main_openacademy_menu"/>
--thefollowingmenuitemshouldappear*after*
itsparentopenacademy_menuand*after*its
actioncourse_list_action-->
action="course_list_action"/>
--Fullidlocation:
action="openacademy.course_list_action"
Itisnotrequiredwhenitisthesamemodule-->
在__openerp__.py中添加这个数据文件名到’data’.
'data':
[
#'security/ir.model.access.csv',
'templates.xml',
'views/openacademy.xml',
],
更新模块后可以看到菜单,操作看看效果.
基本视图
视图定义了模型数据如何显示,每种类型的视图代表一种数据可视化模式.
基本的视图定义
一个视图是以一条ir.ui.view模型数据的形式定义的.
view.name
object_name
--viewcontent:
Treeviews
Treeview也被称为listviews,在一个表格中显示记录.根元素是,最简形式的treeview只是简单地列出每条记录的多个字段,每个字段为一列.
Formviews
Form用于创建或编辑单条记录,根元素是
练习#5
为openacademy创建formview,views/openacademy.xml数据文件中增加容.
xmlversion="1.0"encoding="UTF-8"?
>
course.form
openacademy.course
--windowaction-->
--
Thefollowingtagisanactiondefinitionfora"windowaction",
更新模块,创建一个Course,可以看到formview变了.
练习#6
使用notebook.在formview中,将description字段放在一个tab中,方便随后添加其他tabs,对练习#5的formview数据做如下修改.
Thisisanexampleofnotebooks
更新模块,看效果.
More
还可以使用HTML为formview提供更加灵活的布局,例如下面的例子.
states="draft"class="oe_highlight"/>
states="confirmed"class="oe_highlight"/>
states="confirmed,done"/>
如果一个模型没有定义对应的Searchview,odoo自动创建一个仅搜索name字段的searchview.
添加title以及description搜索,在views/openacademy.xml中定义searchview.
更新模块,搜索框输入字符后可以看到下方能够选择搜索description字段.
一个模型中的记录可能关联到其他模型的记录,例如销售订单记录会关联到一个包含客户信息的客户记录.
为了说明数据关联,首先增加新的模型.
OpenAcademy模块中,一个session是一个在特定时间针对特定听众讲授课程的过程.需要为session创建相应的模型.
session具有name,开始日期,持续时间以及座位数量等.此外还需要添加相应的action和menuitem显示模型数据.
首先在openacademy/models.py中创建Session类.
然后在openacademy/view/openacademy.xml中添加用于访问session模型的action和menuitem定义.