Lichord

学习笔记

0%

Odoo学习

安装

  • 安装odoo和pycharm

  • windows:下载odoo的.exe文件按照默认指引安装就行,注意安装目录不能带有中文和空格,否则之后打开网页可能会报500 internal server error

  • odoo安装,pycharm安装以及配置,模块的安装详细步骤:https://pan.baidu.com/s/1Bfl-1ACbC8viabinKir9sg
    提取码:krxy

    开发

    用脚手架创建新模块

    用Pycharm打开安装odoo目录下的server文件夹,在Terminal中输入

    1
    python .\odoo-bin scaffold todo mymoudles
  • todo是新模块的名字,mymoudles是文件夹名

  • 出现依赖包不存在的报错信息就pip install安装依赖就行

  • 创建成功会增加如下文件夹
    目录.png

  • 也可以手动创建文件夹和文件来创建模块

    项目结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    todo
    ├── \_\_init__.py
    ├── \_\_manifest__.py
    ├── controllers
    │ ├── \_\_init__.py
    │ └── controllers.py
    ├── demo
    │ └── demo.xml
    ├── models
    │ ├── \_\_init__.py
    │ └── models.py
    ├── security
    │ └── ir.model.access.csv
    └── views
    ├── templates.xml
    └── views.xml
  • 每一个python包下都有一个init.py文件,一个odoo模块也是一个python包

    init.py
    1
    2
    3
    4
    # -*- coding: utf-8 -*-
    <!-- 引入了 controllers 和 models 这两个包 -->
    from . import controllers
    from . import models
manifest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# -*- coding: utf-8 -*-
{
'name': "todo",

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

# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_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',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
}
  • 用于声明一个 Odoo 模块以及指定它的元数据(metadata)

  • 文件里只包含了一个单独的 Python 字典,里面默认只列出了 9 项最基本的配置项,包含了模块(或应用)名,模块的简介和详细介绍,作者和网站,模块的所属分类、版本,还有就是这个模块依赖于其他的哪些 Odoo 模块,需要加载哪些数据文件以及演示数据。

  • 除了这里列出的配置项外,还有一些高级配置项

    mvc
  • models,controllers,views文件夹分别存放控制层,模型层,视图层的代码

    demo/demo.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <odoo>
    <data>
    <!-- <record id="object0" model="todo.todo"> -->
    <!-- <field name="name">Object 0</field> -->
    <!-- <field name="value">0</field> -->
    <!-- </record> -->

    <!-- <record id="object1" model="todo.todo"> -->
    <!-- <field name="name">Object 1</field> -->
    <!-- <field name="value">10</field> -->
    <!-- </record> -->
    </data>
    </odoo>
  • 存放演示数据,在使用演示模式时,初始化一些演示数据可以帮我们节省不少的时间

    security/ir.model.access.csv
    1
    access_todo_todo,todo.todo,model_todo_todo,,1,0,0,0
  • 与安全有关

  • 用于定义不同的角色组对应于不同模型的相关权限,包括读(read),写(write),创建(create)和删除(unlink)权限,拥有相关权限则为 1,反之为 0。

  • 默认角色组的定义和模型权限定义在同一目录下,角色组的定义使用.xml 文件

创建模型

  • models/models.py将注释内容删掉,不要修改文件顶部引入的包,添加以下代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class TodoTask(models.Model):
    _name = 'todo.task'
    _description = '待办事项'
    <!-- name 和 is_done 两个字段,它们的类型分别是 Char 和 Boolean,并且我们指定字段 name 是必填的(添加了 required=True) -->
    name = fields.Char('描述', required=True)
    is_done = fields.Boolean('已完成?')
    <!--Selection会显示下拉框选项,('todo', '待办')左边的是数据库中存储的值,右边的是一个用于界面显示的描述。
    默认值 todo,可以为任意类型的字段添加默认值-->
    priority = fields.Selection([
    ('todo', '待办'),
    ('normal', '普通'),
    ('urgency', '紧急')
    ], default='todo', string='紧急程度')
    <!-- 选择日期 -->
    deadline = fields.Datetime(u'截止时间')
  • _name : 模型的名称,在外键或者实例化模型对象时会用到,是模型的唯一标识,是定义一个新的模型时必须要有的属性

  • _description : 模型的描述,描述模型的作用,一般情况下不会主动使用到

  • 除了上面列出的两个特殊属性外,还有一些其他属性,例如更改默认显示名称时会用到 _rec_name,继承现有模型时会用到 _inherit 等

  • 模型改变后需要对模块进行升级才能看到变化

    创建菜单

  • 菜单就是能够在网页安装模块后打开该模块应用的入口

  • 在模块里的 views 目录下创建一个 menus.xml 文件,然后输入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    <?xml version="1.0" encoding="utf-8"?>
    <odoo>
    <data>
    <!-- 主菜单定义 id是菜单唯一标识,name是菜单显示的名字-->
    <menuitem id="menu_todo" name="Todo"/>
    <!-- 菜单动作定义 model是动作类型,act_window 表示我们定义的这个动作是和窗口有关-->
    <record id="action_todo_task" model="ir.actions.act_window">
    <field name="name">待办事项</field>
    <field name="res_model">todo.task</field>
    <field name="view_type">form</field>
    <field name="view_mode">tree,form</field>
    <field name="target">current</field>
    </record>
    <!-- 子菜单定义 action 的值是我们定义的动作的 id,点击这个菜单,就执行对应 id 的动作。sequence 用于指定当前菜单的位置-->
    <menuitem action="action_todo_task" id="submenu_todo_task" name="待办事项"
    parent="menu_todo" sequence="10"/>
    </data>
    </odoo>
  • 把menus.xml放到manifest.py 的 data 列表中

    1
    2
    3
    4
    5
    6
    'data': [
    # 'security/ir.model.access.csv',
    'views/views.xml',
    'views/templates.xml',
    'views/menus.xml',
    ],

创建视图

  • 默认在列表页只显示了一个 name 字段,我们可以根据自己的需求定义视图

  • 打开views/views.xml,把里面注释掉的内容都删掉,然后添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <odoo>
    <data>
    <record id="todo_task_view_tree" model="ir.ui.view">
    <field name="name">todo.task.view_tree</field>
    <field name="model">todo.task</field>
    <field name="type">tree</field>
    <field name="arch" type="xml">
    <tree string="Todo">
    <field name="name"/>
    <field name="is_done"/>
    </tree>
    </field>
    </record>
    </data>
    </odoo>
  • 创建视图相关的内容,我们需要指定属性 model=”ir.ui.view”

  • type:列表视图,填写 tree,表单视图, form,除了这两种视图外还有其他类型的视图

  • arch,显示视图内容,列表视图用tree 包裹,表单视图form,需要在列表视图中将要显示的字段列举出来

参考&更多