要创建一个odoo模块,我们首先要了解odoo模块基本的框架,每个odoo项目要包含哪几个文件和目录?
基本的逻辑是有两个必要的py文件:__ init__.py和__ manifest __.py
init是用来指定项目中你希望包含的python文件
manifest是模块的描述文件,介绍模块的重要属性
目录则可以包含以下几个内容:
models:用来放模型
views:用来放视图
data
security
controllers
demo
等等
首先是创建模型,其次是菜单和动作,最后是视图
在视图中,需要先定义菜单,menuitem,倒着写一个动作,再往上写form ,最上层写tree。系统扫描文件时先定义tree,再定义form.写完view文件后在manifest中data里补充上。
session.py在models中。session_views.xml则对应在views中
在views中,应该在xml中写清楚这个模块菜单的name和id,以及下一层的parent属性应该时上一层的id
manifest中应包含这几个内容:
name、version、category、description、website、author、depends、data、license
name:app可见名字
version:指定版本号
category:web
description:描述模块的用途和目的
author:作者
depends:告知框架这个模块正常运行所需要的基础
data:需要包含在模块中的xml中,如初始数据或者权限
demo:提供演示数据
模块是什么?
新增业务逻辑、修改已有的业务逻辑,odoo中一切都是围绕模块展开的
模块有什么?
包含元素:业务对象、数据文件(xml、csv)web控制器、静态web数据
模块结构
目录
文件
controller 处理浏览器请求
demo 演示数据、说明文档
init.py 初始文件
manifest.py 内部链接
models MVC中的模型,业务对象
security 存放csv文件
view 视图
.xml文件中需要写
<odoo>
<data>
<record id="" model="">record>
data>
odoo>
有odoo data record,在record中添加id model
注:每个record必有一个id
模型、字段(基本字段、保留字段、特殊字段)
data.xml
数据文件要生效
必须加载在manifest中添加 always load
尝试建立一个odoo自定义模块: Mljacademy学院
首先建立一个空的模块,包含以下目录和文件
1.models
2.security
3.view
4.__ init__.py
5.__ manifest__.py
对应odoo建立一个新模块的步骤
其中后续增加data模块
models中建__init__.py、models.py
security中建ir.model.access.csv
views中建views.xml
以下是具体代码的内容
·mljacademy/models/__ init __,py
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
# -*- coding: utf-8 -*-
from odoo import models,fields
class MljCourse(models.Model):
_name = 'mlj.course'
name = fields.Char(string="Title",required=True)
description = fields.Test()
·mljacademy/views/views.xml
注:这部分非常重要,我在这里重复错误了很多次,一定要在view下写空的odoo、data嵌套
<odoo>
<data>
data>
odoo>
·mljacademy/__ init __.py
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from . import models
·mljacademy/__ manifest __.py
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
{
'name':'MLJ学院',
'summary':"""
Short(1 phrase/line) summary of the module's purpose,used as
subtitle on modules listing or apps.openerp.com""",
'description':"""
Long description of module's purpose
""",
'author':'My Company',
'website':'http://www.yourcompany.com',
'category':'Uncategorized',
'version':'0.1',
'depends':['base'],
'data':[
'views/views.xml',
],
'demo':[
],
}
·mljacademy/data/data.xml
<odoo>
<data>
<record model="mlj.course" id="course_01">
<field name="name">odoo开发field>
<field name="description">odoo的官方开发模块field>
record>
<record model="mlj.course" id="course_02">
<field name="name">odoo应用field>
<field name="description">odoo10应用field>
record>
data>
odoo>
然后在manifest中data:加上’data/data.xml’,
注:在这里我犯了一个错误,屡次发布报错,后寻找发现models下models.py中的models.Model的.打成,改正后发布正常。
此时在odoo外部标识中找到course_01和02
动作的三种方式:菜单,视图中的按钮,对象中上下文
动作的快捷方式:ir.ui.menu
动作的定义要在菜单之上
当视图的类型是form时,mode可以是tree或者form
默认显示的是排在前的
开发者模式下的编辑动作就是我们要实现的
·mljacademy/views/views.xml
<odoo>
<data>
<record model="ir.actions.act_window" id="mljacademy.action_menu_kecheng">
<field name="name">课程field>
<field name="res_model">mlj.coursefield>
<field name="view_type">formfield>
<field name="view_mode">tree,formfield>
record>
<menuitem name="学院" id="mljacademy.menu_root"/>
<menuitem name="教务" id="mljacademy.menu_jiaowu" parent="mljacademy.menu_root"/>
<menuitem name="课程" id="mljacademy.menu_kecheng" parent="mljacademy.menu_jiaowu"
action="mljacademy.action_menu_kecheng"/>
data>
odoo>
到这步,菜单和动作就完成了
·mljacademy/views/view.xml
追加
这里写一个search视图,用来搜索
如果没有定义生成视图,odoo会自动生成一个search为name的字段
<record id="view_mlj_course_filter" model="ir.ui.view">
<field name="name">view.mlj.course.filterfield>
<field name="model">mlj.coursefield>
<field name="arch" type="xml">
<search string="课程">
<field name="name" string="课程名称"/>
<field name="description" string="描述"/>
search>
field>
record>
<record model="ir.ui.view" id="view_mlj_course_list">
<field name="name">view.mlj.course.listfield>
<field name="model">mlj.coursefield>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="description"/>
tree>
field>
record>
创建和编辑一条记录
sheet 分成左右两页 左边是titile 右边是description
·mljacademy/views/view.xml
追加
<record id="view_mlj_course_form" model="ir.ui.view">
<field name="name">view.mlj.course.formfield>
<field name="model">mlj.coursefield>
<field name="arch" type="xml">
<form string="课程">
<sheet>
<group>
<group>
<field name="name"/>
group>
group>
<group>
group>
<notebook>
<page string="信息">
<field name="description"/>
page>
<page string="关于">
这是关于。。。。
page>
notebook>
sheet>
form>
field>
record>
一个模型的记录和另一个模型的记录要相连。例如:销售订单的记录关联到客户上
在课程模块里就是在特定的时间段内开哪些课
创建一个session模块
·在models中添加session
class MljSession(models.Model):
_name = 'mlj.session'
name = fields.Char(string="Session")
start_date = fields.Date(string="开始时间")
duration = fields.Float(digits=(6,2),help="Duration in days")
seats = fields.Integer(string="座位数")
·views.xml中追加
<record id="view_mlj_session_list" model="ir.ui.view">
<field name="name">view.mlj.session.listfield>
<field name="model">mlj.sessionfield>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="start_date" />
<field name="seats" />
tree>
field>
record>
<record id="view_mlj_session_form" model="ir.ui.view">
<field name="name">view.mlj.session.formfield>
<field name="model">mlj.sessionfield>
<field name="arch" type="xml">
<form string="Session">
<sheet>
<group>
<group>
<field name="name"/>
<field name="start_date"/>
<field name="duration"/>
<field name="seats"/>
group>
group>
sheet>
form>
field>
record>
<record model="ir.actions.act_window" id="action_menu_session">
<field name="name">Sessionsfield>
<field name="res_model">mlj.sessionfield>
<field name="view_mode">tree,formfield>
record>
<menuitem name="Session" id="mljacademy.menu_session" parent="mljacademy.menu_jiaowu"
action="mljacademy.action_menu_session"
sequence="20"/>
M2O是一条记录
O2M是一个容器,多条记录
官方文档说明:要有O2M必有M2O,这个M2O在other_model上
M2M
笔记:
简单的基本开发步骤:
一共包括四个文件,俩文件。见上述
1.data 存储数据文件,以记录存储data.xml格式,odoo嵌套data 内容写record ,models用来写模型,存–init–.py文件。
2.models.py中要写明引用的模块models,fields定义新的类,写入-name=‘模块名‘ ,例如mlj.course
定义name=fields.Char(String="",required)
description = field.Text()
-init-.py中添加引用即可
3.views内存xml文件,对应models内容。xml格式是odoo data嵌套 其中三部分是菜单、动作、视图,依此从下网上写。
菜单:menuitem ,属性是name id parent
菜单的名字可以随意取,id要有菜单的意义
id= mlj.course_menu_root :这个是根菜单
子菜单在parent中写明父菜单的id
动作:record 记录。model、id是属性
model固定的格式是ir.actions.act_window
id是项目,动作的id是mljcourse.action_kecheng
field属性包括:name + 内容
res_model 项目_name
view_type form
view_mode tree,form
视图:record记录 model、id作为属性
包括tree、form
form、tree视图的model是ir.ui.view
field属性有name :view.项目名_name.form
model:项目_name
arch type:xml
form标签内写sheet 嵌套group和notebook
这里有一篇文章写的也很好
https://blog.csdn.net/qq_29654325/article/details/78017047