odoo 数据文件、动作和菜单
4、数据文件
Odoo是一个高度数据驱动的系统, 虽然使用Python代码来定制模块行为, 但很多模块数据是在其载入时setup的, 并且有些模块仅仅为Odoo添加数据.
创建一个数据文件
创建一个data/course_data.xml,目录结构如图:
文件中内容为:
<odoo> <data noupdate="1"> <record id="course0" model="myproject.course" > <field name="name">python课程</field> <field name="description">这是一门关于python的课程 讲解的是odoo框架的内容 </field> </record> <record id="course1" model="myproject.course" > <field name="name">英语</field> </record> <record id="course2" model="myproject.course" > <field name="name">数学</field> <field name="description">这是一门关于数学的课程</field> </record> </data> </odoo>
注:往myproject.course数据表中插入三条固定的数据,name=”name”和name=”description”为表的列名,noupdate=”1”为固定数据的意思 。
XML文件说明
<?xml version="1.0" encoding="UTF-8"?>
要在XML中声明记录,建议使用记录符号(使用):
-
id属性放在model前面
-
对于字段声明,首先定义name.然后将 值放在field标签中,或者在eval 属性中,最后根据重要性排序其他属性(小部件,选项,…)。
-
根据模型组织record组。在定义依赖的时候(在action/menu/views之间),本规则不适用.
-
使用命名规则定义下一个节点(point)
-
标签
<data>
标签只在一种情况下使用,设置不需要更新的数据not-updatable noupdate=1。比如:
<odoo> <data noupdate="1"> <record id="view_id" model="ir.ui.view"> <field name="name">view.name</field> <field name="model">object_name</field> <field name="priority" eval="16"/> <field name="arch" type="xml"> <tree> <field name="my_field_1"/> <field name="my_field_2" string="My Label" widget="statusbar" statusbar_visible="draft,sent,progress,done"/> </tree> </field> </record> </data> </odoo>
Odoo支持用作语法自定义标签:
- menuitem:用它作为一个快捷方式来声明一个 ir.ui.menu
- workflow:标签向现有工作流发送信号
- template:使用它来声明仅需要查看arch部分的QWeb View
- report:用来声明报告动作
- act_window:打开一个动作窗口。
通过数据文件来定义模块数据, 例如可以使用XML文件中的<record>元素定义数据, 每一个<record>元素创建或者更新数据库中的一条记录, 形式如下:
<odoo> <data> <record id="记录id" model="模型名称" > <field name="字段名">"字段值"</field> </record> </data> </odoo>
- model
Odoo模型名. - id
外部ID(External Identifier), 通过它可以引用到记录(并且不需要知道记录所在的数据库ID). - 元素
name属性用于确定字段名称(例如description), 该元素的body给出字段的值.
数据文件必须在模块载入清单文件列表中, 也就是__manifest__.py的’data’:列表(全部载入)或’demo’列表(只有设定为载入演示数据才会载入)中.
安装应用
找到myproject/my_first_app/__manifest__.py文件,修改里面的内容:
# -*- coding: utf-8 -*- { 'name': "my_first_app", 'summary': """ 第一个odoo应用,课程、课时模块""", 'description': """ 第一个odoo应用,课程、课时模块 """, 'author': "LDC", 'website': "http://odoo.qsxbc.com", # Categories can be used to filter modules in modules listing # Check https://github.com/odoo/odoo/blob/14.0/odoo/addons/base/data/ir_module_category_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', 'data/course_data.xml', ], 'application': True, }
主要是声明初始化数据,然后是添加’application’: True,允许安装应用。
使用Debug运行项目,打开浏览器,输入http://127.0.0.1:8069/web?debug=assets 使用开发者模式
注:
debug=1 使用debug模式 debug=assets 使用开发者模式,这个是调试前端代码时常用到的
之后就可以在浏览器上看见自己创建的应用了,找到它,然后点击安装即可。如果找不到就点击左上角的【刷新本地模块列表】按钮。
安装成功后在数据库中就可以看到表了。
5、动作和菜单
在Odoo中, 动作和菜单都是定义在数据库中的数据记录, 一般通过数据文件来定义.
动作可以由三种方式触发:
- 点击菜单项(菜单项链接到特定动作)
- 点击视图上的按钮(如果按钮连接到动作)
- 作为对象的上下文动作
使用<menuitem>声明一个ir.ui.menu并将其连接到一个action, 可以用下面的形式的代码.
注意: action必须先于menu的连接使用定义, 数据文件在载入时顺序地执行, 所以动作的ID必须首先存在于数据库中才能使用.
定义一个新的菜单项访问myproject课程.
创建myproject/my_first_app/views/menu_views.xml文件
菜单
<?xml version="1.0" encoding="UTF-8"?> <odoo> <data> <menuitem id="myproject_course_app_menu" name="课程应用" sequence="10" groups="base.group_user"/> <menuitem id="myproject_course_module_menu" name="课程模块" sequence="1" parent="myproject_course_app_menu"/> <!-- Force empty action, to ease upgrade --> <record id="myproject_course_module_menu" model="ir.ui.menu"> <field name="action" eval="False"/> </record> </data> </odoo>
tree、form视图
创建myproject/my_first_app/views/course_views.xml文件
<odoo> <data> <record model="ir.ui.view" id="course_tree_view"> <field name="name">course.tree</field> <field name="model">myproject.course</field> <field name="arch" type="xml"> <tree string="Course Tree"> <field name="name"/> <field name="description"/> </tree> </field> </record> <record model="ir.ui.view" id="course_form_view"> <field name="name">course.form</field> <field name="model">myproject.course</field> <field name="arch" type="xml"> <form string="Course Form"> <sheet> <group> <field name="name"/> <field name="description"/> </group> </sheet> </form> </field> </record> <record id="course_list_action" model="ir.actions.act_window"> <field name="name">课程</field> <field name="res_model">myproject.course</field> <field name="view_mode">tree,form</field> <field name="view_id" ref="course_tree_view"/> <field name="help" type="html"> <p class="o_view_nocontent_smiling_face"> Setup a new automated automation </p> </field> <field name="groups_id" eval="[(4, ref('base.group_user'))]"/> </record> <menuitem id="myproject_course_menu" parent="my_first_app.myproject_course_module_menu" sequence="10" name="课程" action="my_first_app.course_list_action"/> </data> </odoo>
开通权限
myproject/my_first_app/security/ir.model.access.csv
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_myproject_course,myproject.course,model_myproject_course,base.group_user,1,1,1,1 access_myproject_session,myproject.session,model_myproject_session,base.group_user,1,1,1,1
注:res_model为数据库,view_type为进入菜单默认的视图类型(默认的界面),view_mode为该动作所有的高级视图类型,help为没有数据情况下的提示。
在__manifest__.py中添加这个数据文件名到’data’.
'data': [ 'security/ir.model.access.csv', 'data/course_data.xml', 'views/menu_views.xml', 'views/course_views.xml', ],
先刷新本地模块列表,然后安装模块后可以看到菜单, 操作看看效果:
默认的界面),view_mode为该动作所有的高级视图类型,help为没有数据情况下的提示。
在__manifest__.py中添加这个数据文件名到’data’.
'data': [ 'security/ir.model.access.csv', 'data/course_data.xml', 'views/menu_views.xml', 'views/course_views.xml', ],
先刷新本地模块列表,然后安装模块后可以看到菜单, 操作看看效果:
关注我,我们一起成长~~