企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
在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视图 好了,现在可以看到请假模块界面,能实现基本的增删改查功能。