以下操作均在windows环境下
版本:odoo11
一.模块搭建
python odoo-bin scaffold 模块名 模块所在的文件名
python odoo-bin scaffold demo my-modules
看下图就搭建好了一个模块,但这个模块在系统应用中还没法看到的
下面讲一下模块组织结构:
- controllers
需要自定义路由在该文件里面配置 - models
在该文件里面创建模型,就是我们数据库字段,以及处理逻辑交互 - security
配置权限 - views
在这个文件写前端视图页面 - manifest.py
在这个文件里配置模型名,配置模型依赖,以及前端xml文件都要配置到这个文件
接下来我们需要到odoo.conf文件里配置addons_path如下图,(odoo.conf在debian文件里面)
现在到系统里面激活开发者模式,在应用中更行模块,再搜索模块名就可以看到我们搭建的模块啦,点击安装但页面上什么都不显示,不要着急这是因为还没有开发,模块里面目前没有任何内容
二.开发
首先在models文件夹下创建一个demo.py,把demo.py引入同目录下的_init_.py里面,回到demo.py建一个数据模型demo,
_name: 模型名,其他模型需要调用某个模型时需要用到
_inherit :继承,继承某个模型的字段
设置字段使用fields:
1.字段基本类型:
char: 字符
Boolean: 布尔 b = fields.Boolean(string=“布尔”,require=True)
Integer: 整型 i = fields.Integer()
Float: 浮点 f = fields.Float()
Selection: 下拉选择 s = fields.Selection()
Date: 日期 YY-DD-MM d = fields.Date()
Datetime: 时间 YY-DD-MM hh: mm: ss
Html: 富文本编辑
Text: 文本
Binary: 上传保存图片、视频、文件、附件等,Odoo底层对该类型字段的容量作了限制,最多能容纳20M内容
2.关联字段类型
many2one: 多对一,关联对象的name user_id= fields.many2one(‘模型名’,string=“标签名”,domian=[()], )
one2many: 一对多
many2many: 多对多
demo.py
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class demo(models.Model):
_name="my.demo"
name = fields.Char(string="姓名")
value= fields.Integer(string="值")
xml中视图创建(xml一定要引入__manifest__.py文件里面)
demo.xml
<odoo>
<data>
<!--odoo里面有三个视图分别为tree视图显示表格,search视图搜索,以及form视图表单,详情展示-->
<!--每个视图的id必须以模块名作为开头否则报错-->
<!--tree视图-->
<record model="ir.ui.view" id="demo.list_demo">
<field name="name">demo list</field><!--这个可以随便填但不可以太长否则也会报错-->
<field name="model">my.demo</field><!--demo.py里面设置的模型名_name-->
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="value"/>
</tree>
</field>
</record>
<!--自定义的form视图,可以根据自己需要添加字段,或布局,如果不写系统会使用模型中的字段自动建立一个from视图-->
<record id="demo_form_view" model="ir.ui.view">
<field name="name">my.demo.form</field>
<field name="model">my.demo</field>
<field name="arch" type="xml">
<form string="新建">
<sheet>
<group>
<field name="name"/>
</group>
<notebook>
<page string="page1">
</page>
<page string="page2">
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!--search视图-->
<record model="ir.ui.view" id="demo_note_search">
<field name="name">查询</field>
<field name="model">my.demo</field>
<field name="arch" type="xml">
<search string="查询">
<!-- 可搜索的内容 -->
<field name="name"/>
</search>
</field>
</record>
<!--页面动作各种视图切换在这里可以设置上下文context在里面可以做编辑创建导入按钮的隐藏,页面数据查询也是在这里-->
<record model="ir.actions.act_window" id="demo_action_contract">
<field name="name">类似面包屑显示</field>
<field name="res_model">my.demo</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="domain">[('name', '=', '张三')]</field><!--在my.demo的数据模型中过滤出name为张三的数据-->
<!--指定视图,有时候会遇到同一个模型要显示不同字段的情况,比较复杂的时候可以写多个视图在这儿来指定-->
<field name="view_ids" eval="[(5, 0, 0),
(0, 0, {'view_mode': 'tree', 'view_id': ref('demo.list_demo')}),
(0, 0, {'view_mode': 'form', 'view_id': ref('demo_form_view')}),
(0, 0, {'view_mode': 'kanban'})]"/>
<field name="help" type="html"> <!--在没有数据的情况下显示的提示文案-->
<p class="oe_view_nocontent_create">
点击创建申请
</p>
</field>
</record>
<!--菜单导航设置-->
<menuitem name="demo" id="demo.menu_root"/> <!--显示在页面的顶部,后面的子菜单显示在侧边栏-->
<menuitem name="一级菜单" parent="demo.menu_root" id="demo.menu_first"/> <!--每一级菜单关联使用parent属性值为上一级菜单的id-->
<menuitem name="一级子菜单" parent="demo.menu_first" id="demo.menu_first_child" action="demo_action_contract"/><!--action关联该菜单栏对应的动作视图-->
</data>
</odoo>
页面效果展示
tree和search视图
form视图