odoo 数据文件、动作和菜单

点我下载完整odoo的demo

4、数据文件

Odoo是一个高度数据驱动的系统, 虽然使用Python代码来定制模块行为, 但很多模块数据是在其载入时setup的, 并且有些模块仅仅为Odoo添加数据.

创建一个数据文件

创建一个data/course_data.xml,目录结构如图:

4、odoo数据文件、动作和菜单_odoo

文件中内容为:

<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 使用开发者模式,这个是调试前端代码时常用到的

之后就可以在浏览器上看见自己创建的应用了,找到它,然后点击安装即可。如果找不到就点击左上角的【刷新本地模块列表】按钮。

4、odoo数据文件、动作和菜单_odoo_02

安装成功后在数据库中就可以看到表了。

4、odoo数据文件、动作和菜单_odoo_03

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',
    ],

先刷新本地模块列表,然后安装模块后可以看到菜单, 操作看看效果:

4、odoo数据文件、动作和菜单_odoo_04
点我下载完整odoo的demo

 

4、odoo数据文件、动作和菜单_odoo_05

 

关注我,我们一起成长~~