在windows cmd命令行下:
~~~
e:
cd E:\GOdoo10
E:\GOdoo10\runtime\python\python source\odoo-bin scaffold qingjia myaddons
~~~
E:\GOdoo10 是odoo10绿色版的解压目录。
E:\GOdoo10\runtime\python\python 这个是绿色版自带的python环境,source\odoo-bin 是odoo10源码中的odoo命令入口,scaffold 是odoo的脚手架功能,可以创建一个标准的odoo模块框架,qingjia是创建的模块名,myaddons是模块所放置的目录路径。模块加载目录有两个,一个是GOdoo10\myaddons,另一个是GOdoo10\source\addons,但是按约定GOdoo10\source\addons放系统模块,GOdoo10\myaddons放自己开发的模块。
![](http://upload-images.jianshu.io/upload_images/3551405-07ee550e0fb3cbc7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
请假单目录结构
建立完成后,目录是这样的,这里是用pycharm进行开发的,也可以用vs2015进行开发。
![](http://upload-images.jianshu.io/upload_images/3551405-e3d35cbbdfbd0de3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
激活开发者模式
以管理员身份登录系统,设置>激活开发者模式,odoo中很多操作和设置是需要管理员身份在开发者模式下才能进行的。
![](http://upload-images.jianshu.io/upload_images/3551405-9a7d3c46af6ce243.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
安装请假模块
应用>更新应用列表,更新应用列表是为了能够搜索到刚刚添加的qingjia模块。更新完成后,在搜索栏关闭“应用”标签,然后输入qingjia搜索,能看到我们的模块了。安装qingjia模块,安装完成后会发现什么也没增加,正常,因为脚手架中还没有加入任何代码。现在开始加入代码,编辑文件`__manifest__.py`
~~~
# -*- coding: utf-8 -*-
{
'name': "qingjia",
'summary': """
请假模块""",
'description': """
请假模块
""",
'author': "leo",
'website': "http://www.yourcompany.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/openerp/addons/base/module/module_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base'],
# always loaded
'data': [
# 'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}
~~~
这是整个模块的配置文件,配置项从字面上很容易理解。
name:模块名,会显示在模块列表中。
summary:摘要,在模块详情显示。
description:描述,在模块详情显示。
depends:模块依赖项,在这个模块中没有需要依赖的其它模块,保留默认的base。
data:模块资源文件,视图、菜单、权限等都可以写在资源文件中。
demo:模块演示数据。
修改模块的类文件 `models/models.py`
~~~
from odoo import models, fields, api
class qingjiadan(models.Model):
_name = 'qingjia.qingjiadan'
name = fields.Char(string="申请人")
days = fields.Integer(string="天数")
startdate = fields.Date(string="开始日期")
reason = fields.Text(string="请假事由")
~~~
这里我们定义了qingjiadan对象模型,包含四个属性,name,days,startdate,reason。在模块安装完成后,odoo的ORM框架会自动把这个对象映射到数据库表。属性类型会映射到表字段数据类型,表名是`模块名_对象名`,比如这个对象对应的表名是`qingjia_qingjiadan`
修改资源文件 `views/views.xml`
~~~
<openerp>
<data>
<!-- tree视图 -->
<record id="view_tree_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">请假单列表</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
</tree>
</field>
</record>
<!-- form视图 -->
<record id="view_form_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">请假单</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<form>
<sheet>
<group name="group_top" string="请假单">
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
<field name="reason"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- 视图动作 -->
<act_window id="action_qingjia_qingjiadan"
name="请假单"
res_model="qingjia.qingjiadan"
view_mode="tree,form" />
<!-- 顶级菜单 -->
<menuitem name="请假" id="menu_qingjia"/>
<!-- 二级菜单 -->
<menuitem name="请假单" id="menu_qingjia_qingjiadan" parent="menu_qingjia" action="action_qingjia_qingjiadan"/>
</data>
</openerp>
~~~
这里定义了一个tree视图,一个form视图,一个视图动作,还有两个菜单。
tree视图用于显示请假单列表页面。
`<record id="view_tree_qingjia_qingjiadan" model="ir.ui.view">`
id tree视图的全局唯一标识
model 资源类型,tree视图和form视图都是`ir.ui.view`,这里对应ir_ui_view数据库表,模块安装后,资源数据会写入对应的数据库表中。
`<field name="model">qingjia.qingjiadan</field>`
将这个视图与我们之前定义的对象模型`qingjia.qingjiadan`进行绑定。
~~~
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
</tree>
</field>
~~~
这里表示这是一个tree视图,并定义列表项显示的列。在列表项中显示name,days,startdate三个字段的内容,这里字段都是在`qingjia.qingjiadan`对象模型中定义的。
form视图用于显示请假单详情页,定义方式与tree视图类似。有两个特殊的容器`<sheet><group>`是用于页面布局的。
~~~
<act_window id="action_qingjia_qingjiadan"
name="请假单"
res_model="qingjia.qingjiadan"
view_mode="tree,form" />
~~~
这里定义视图动作,视图动作将菜单、视图、模型进行关联。
name 会在模块的导航条中显示
res_model 视图动作绑定的模型
view_mode 视图动作关联的视图类型
~~~
<!-- 顶级菜单 -->
<menuitem name="请假" id="menu_qingjia"/>
<!-- 二级菜单 -->
<menuitem name="请假单" id="menu_qingjia_qingjiadan" parent="menu_qingjia" action="action_qingjia_qingjiadan"/>
~~~
这里定义了两级菜单,顶级菜单将出现在odoo导航菜单上,二级菜单的通过`parent`属性与顶级菜单关联,`action`是菜单点击动作响应方法。
![](http://upload-images.jianshu.io/upload_images/3551405-5ecef42564a9e9cb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
模块升级
修改完代码后,重启odoo服务,重新登录系统,在应用>应用中再次找到我们之前安装过的qingjia模块,进入模块详情,把qingjia模块升级。
![](http://upload-images.jianshu.io/upload_images/3551405-626f81945f6129c2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
请假单tree视图
![](http://upload-images.jianshu.io/upload_images/3551405-835f6e1058c689a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
请假单form视图
好了,现在可以看到请假模块界面,能实现基本的增删改查功能。