1.模块目录
__manifest__.py:模块的配置文件
data:数据文件存储目录
models:模型存放的目录
security:权限配置文件存放目录
views:视图数据存放目录
2.__manifest__.py中的信息
# -*- coding: utf-8 -*-
{
'name': "模块名字",
'license': 'Other proprietary',
'version': '版本',
'summary': """
模块摘要""",
'description': """
模块描述信息
""",
'author': "作者",
'website': "网站",
'category': '模型类型',
# any module necessary for this one to work correctly
'depends': [''], # 当前模块依赖的模块
# always loaded
# 数据文件列表,视图、权限文件路径需要放在data中,主要菜单的xml文件必须放在其他视图xml文件之后
'data': [
],
# only loaded in demonstration mode
'demo': [
],
# 是否可安装
'installable': True,
# 是否可应用
'application': True,
# 是否字段安装
'auto_install': False,
# 模块安装完成后执行方法函数
# 'post_init_hook': '_create_srm_table',
}
3.__init__.py文件
导入models
from . import models
4.models模型开发
4.1 __init__.py文件
导入models目录下创建的模板文件
from . import asset_category
from . import asset_transaction_type
from . import asset_period
4.2 模板文件案例
from odoo import models, fields, api
class EnoAssetPeriod(models.Model):
_name = 'eno.asset.period'
_description = '资产期间'
name = fields.Char(string='名称', required=True)
asset_period_status = fields.Selection([('open', '打开'), ('done', '关闭')], string='资产期间状态', default='open')
date_form = fields.Date(string='开始日期', required=True)
date_to = fields.Date(string='结束日期', required=True)
company_id = fields.Many2one(comodel_name='res.company', string='关联公司', default=lambda self: self.env.company,
required=True)
_name:模板名称属性
_description:模型描述信息
4.2.1 常见字段类型
1.fields.Integer:整数类型
2.fields.Float:浮点数类型
3.fields.Char:字符串类型
4.fields.Date:日期类型。
5.fields.Datetime:时间类型。
6.fields.Selection:列表类型。
7.fields.Reference:参考字段类型。该类型是selection类型的延伸,用于存储关联表数据行
8.fields.Many2one:多对一字段类型。表关联多对一结构。
9.fields.One2many:一对多字段类型。和fields.Many2one多对一字段类型相对应
10.fields.Many2many:多对多字段类型。多对多表结构设置。
注意:多对一、一对多、多对多字段定义时以xxxx_id进行命名
4.2.2 常见字段属性
1.string:页面显示的字段标签名称。缺省则显示字段本身
2.help页面显示的字段提示信息。缺省则显示字段本身。
3.readonly:字段只读参数。默认为False,设置为True时,页面该字段不可编辑。
4.required:字段必输参数。默认为False,设置为True时,页面该字段必输,数据表该字段不能为空。
5.index:字段索引参数。默认为False,设置为True时,数据表该字段建立索引。
6.default:字段默认值参数。缺省为空。可设置固定值或者带返回值方法。
7.store:可存储参数。普通字段默认为True,字段值存储数据库表中。computed字段,默认为False,不在数据库表中存储字段的值
8.compute:计算字段参数。设置该参数的字段为计算字段,该字段的值由配置的计算方法计算得出。
9.related:引用字段参数。设置了该参数的字段相当于是配置字段的一个复制字段
10.domain:domain表达式。通常用来筛选数据记录。它们使用特殊的语法,以便于Odoo ORM 将它们解析后生成对应的SQL WHERE数据库筛选语句。
5.views视图开发
odoo框架的视图使用xml进行编写开发,主要是图有tree form search action menu data kanban 日历 甘特,值得注意的是每一个xml视图文件需要在___manifest__.py的data中进行定义。
5.1 tree视图
以列表形式展示多条数据,根元素是<tree>,其中包裹任意field,每一个field就是列表 中的一列
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.ui.view" id="id需要唯一">
<field name="name">视图名</field>
<field name="model">模型名</field>
<field name="type">tree</field>
<field name="arch" type="xml">
<!--显示的字段-->
<tree>
<field name="name"/>
<field name="asset_period_status"/>
<field name="date_form"/>
<field name="date_to"/>
<field name="company_id"/>
</tree>
</field>
</record>
</data>
</odoo>
5.1.1 tree部分属性介绍
editable:默认,选择列表视图的行打开对应的 表单视图。editable 属性让视图本身在原处可编辑。
有效的值有 top 和 bottom,让新记录分别出现在列表的顶部或底部。
default_order:重载视图的顺序,替换模型的默认顺序。值为一个字段的逗号分隔列表,后接 desc 来进行反向排序:
create, edit, delete, duplicate, import, export_xlsx:允许通过设置相应属性为 false来在视图中禁用相应的动作
attrs:基于记录值的动态属性。属性对作用域的映射,作用域在当前行记录的上下文中运行,如为True ,在单元格中设置相应属性。
button:在列表单元格中显示按钮
context:在执行按钮的Odoo调用时合并入视图的上下文
confirm:在进行按钮的 Odoo 调用之前显示的(供用户接受的)确认消息
field:定义相应字段应针对每条记录显示的列(name、string、invisible、groups、widget、attrs、width、groupby、name、string、context括号中的属性均可使用)
5.2 form视图
表单视图用于显示单条记录的数据。它们的根元素是<form>。它们由带有额外结构和语法组件的常规 HTML所组成。
<record id="唯一id" model="ir.ui.view">
<field name="name">视图名</field>
<field name="model">模型</field>
<field name="arch" type="xml">
<form string="显示字段">
<sheet>
<group col="4">
<field name="name"/>
<field name="asset_period_status"/>
<field name="date_form"/>
<field name="date_to"/>
<field name="company_id" domain="[('id','in',allowed_company_ids)]" options="{'no_open': True,'no_create': True}"/>
</group>
</sheet>
</form>
</field>
</record>
5.2.1 form部分属性介绍
notebook:定义标签区块。每个标签通过一个 page 子元素进行定义
page:页标签
group:用于定义表单中的列布局
newline:仅在 group元素中可用, 提前结束当前行并立即切换到新行 (不预先填入任何剩余列)
separator:小的横向空格,带 string 属性时作为区块的标题
sheet:可用于 form的直接子元素,针对更窄或更具响应式的表单布局
header:与sheet拼接,在表单上方提供全宽的位置,通常用于显示工作流按钮及状态小组件
button:对Odoo系统进行调用,类似于表单视图按钮。
field:渲染(并在可能时允许编辑)当前记录的单个字段(name、widget、options、class、oe_inline、groups、attrs、domain、context、readonly、required、nolabel、placeholder、password括号中的属性均可使用)
5.3 search搜索视图
搜索视图是此前那些视图类型的分解,在其中不显示内容,虽然它们应用于具体的模型,却用于过滤其它视图的内容(通常为 列表视图 或 图形视图等的聚合视图)。除用例的这种不同外,它们的定义方式相同。Search:在列表视图中提供搜索功能,根元素是<search>
<record id="唯一id" model="ir.ui.view">
<field name="name">search</field>
<field name="model">模型</field>
<field name="arch" type="xml">
<search>
<!--搜索类型-->
<field name="name"/>
<field name="number"/>
<!--筛选类型-->
<filter string="固定资产类别" name="capitalization"
domain="[('asset_type', '=', 'capitalization')]"/>
<filter string="无形资产类别" name="intangible_assets"
domain="[('asset_type', '=', 'intangible_assets')]"/>
<!--分组类型-->
<group>
<field string="上级类别" name="parent_id" context="{'group_by':'parent_id'}"/>
</group>
<group>
<field string="归口管理部门" name="admin_dept_id" context="{'group_by':'admin_dept_id'}"/>
</group>
</search>
</field>
</record>
5.3.1 search部分属性介绍
field:字段定义含用户提供值的域或上下文
name:待过滤的字段名
string:字段的标签
operator:属性允许根据字段类型重载默认运算符 (如针对浮点字段的= 、针对字符字段的ilike )
filter_domain:用作字段搜索作用域的完整域,可使用 self 变量来在自定义域中注入所提供的值。可用于生成比运算符 本身灵活得多的作用域 (如同时对多个字段的搜索)
groups:让字段仅有特定用户可用
filter:过滤器是搜索视图中预定义的切换,仅能启用或禁用。其主要目的是向搜索上下文添加数据(对搜索/过滤的数据视图传递的上下文),或向搜索视图添加版块。
context:一个Python字典,合并入动作的作用域来生成搜索作用域
separator:可用于在简单搜索视图中分隔过滤器组
searchpanel:允许在任意多个记录视图的左侧显示搜索面板)
5.4 动作视图
Action,在odoo中翻译成动作,顾名思义就是相当于一个连接菜单、按钮和前端页面跳转已经一些后台方法调用的开关,odoo中的动作有五种,分别是窗口动作、URL动作、报表动作、服务器动作以及客户端动作。
<record id="唯一id" model="ir.actions.act_window">
<field name="name">动作名</field>
<field name="res_model">模型</field>
<!--视图类型-->
<field name="view_mode">tree,form</field>
</record>
5.4.1 部分属性介绍
res_model:用于展示视图的模型
views:(view_id, view_type) 对的列表。每组的第二个元素是视图的分类 (tree, form, graph, …) ,第一个是可选的数据库 id (或 False)。若未提供 id,客户端应获取对所请求模型指定类型的默认视图(默认通过fields_view_get()来实现). 列表的第一个类型是默认视图类型列表,在动作执行时会默认打开。每个视图类型在列表中最多出现一次。
res_id :若默认视图为 form,指定要加载的记录(否则应创建一条新记录)
search_view_id :(id, name) 对, id 为针对动作所加载的指定搜索视图的数据库标识符。默认获取模型的默认搜索视图
target :是否应在主内容区 (current)中以全屏模式(fullscreen)或对话框/弹窗(new)中打开视图。使用 main 代替 current 来清除面包屑导航。默认为current
context、domain、limit:字面意思
view_mode :(默认= tree,form )视图类型的逗号分隔列表作为字符串(/!\ 无空格 /!\)。所有这些类型会在生成的views 列表中出现 (至少有一个False view_id)
view_id:在类型是view_mode列表的一部分且没有由view_ids中的视图进行填充时,添加到 views 中的指定视图
5.5 菜单视图
关联系统整体结构,进入查看详细层级数据页面。一级菜单,二级菜单...,父级菜单:不需要挂载动作
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<menuitem sequence="01" name="资产" id="eno_asset_menu"/>
<menuitem sequence="06" name="资产设置" id="eno_asset_setting_menu" parent="eno_asset_menu"/>
<menuitem sequence="01" name="资产类别" id="eno_asset_category_menu" parent="eno_asset_setting_menu"
action="view_eno_asset_category_action"/>
<menuitem sequence="02" name="事务处理类型" id="eno_asset_transaction_type_menu" parent="eno_asset_setting_menu"
action="view_eno_asset_transaction_type_action"/>
<menuitem sequence="03" name="资产期间" id="eno_asset_period_menu" parent="eno_asset_setting_menu"
action="view_eno_asset_period_action"/>
</data>
</odoo>
5.5.1 部分属性介绍
name:显示名称,如果没有设置 name 属性,那么就从这个 menu 对应的 action 的 name,如果没有 action,就使用 id
action:点击这个菜单所触发的动作
parent:层级关系,如果设置了 parent 属性,那么它的值应该是另一个 menu item 的 external id 如果没有设置 parent ,将会尝试从 name 属性中 按照 / 来分隔,找到对应的层级来创建,如果找不到,就依次创建对应的 menu item
sequence:排序
groups:指定哪个组可以看见此菜单
5.6 初始化数据
初始化数据文件一般放在data文件夹
<record>标签用可以初始化任何存储模型的数据
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<record id="eno_asset_transaction_type_asset_addition" model="模型">
<field name="name">资产增加</field>
<field name="code">asset_addition</field>
<field name="note">资产增加</field>
</record>
</data>
</odoo>
5.6.1 部分属性介绍
id:数据唯一外部ID
model:数据写入模型
field:初始化模型的字段值
6. security权限目录
在此目录下包括txt文件,里面包含了对模型的权限控制
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
唯一id,name,模型,组,读,改,写,删