跟我学Xodoo第二天

本文详细介绍了如何在Odoo中创建模块,包括使用脚手架、模型结构、关系定义、视图文件结构(如菜单、动作和视图类型)以及基本视图的编写。重点讲解了模型的属性、不同类型的模型和视图文件中的元素结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模块的创建

快速创建一个模块,最简的目录

module_name

├─ __init__.py 

├─ __manifest__.py

├─ models

│  ├─ __init__.py 

│  └─ models.py 

├─ security 

│  └─ ir.model.access.csv

└─ views

    └─ views.xml

方法一,通过脚手架scaffold 创建

1、首先进入终端 可以使用cmd命令行进入 我这里直接从pycharm进入

2、要进入到和odoo-bin同一个目录

3、命令 python odoo-bin scaffold <module_name> <path_to_target_dir>

  • <module_name>:替换为你想要创建的模块的名称,例如"my_module"。
  • <path_to_target_dir>:替换为你希望在其中创建模块的目标目录的路径。

方法二,可以直接复制模块或创建空文件目录(注意模块&模型的唯一性)

我这里使用方法一创建的模块,模块在addons里面

controllers:网站控制器,定义web访问的返回,也常用于IoT

demo:带演示数据的数据文件,可用于测试、培训或模块评测

models:代码核心,包含我们的各种模型

security:权限控制目录

views:视图文件目录。决定models目录下model的前端界面呈现

__manifest__.py

ir.model.access.csv

第一行为格式,第二行为test2 model的权限设置

创建好之后就可以直接重新启动服务,登录进去就能看见了

模型

在Xodoo中,一切皆模型。Xodoo将各种数据安装模型分表存储,在查看时,按照索引从各个表格读取信息,组合成我们看到的内容

模型的属性

模型内置属性:可以使用一些内置属性来定义模型的一些特征:

_name:创建Xodoo模型的内部标识符,必含项。

_description:当用户界面显示模型时,一个方便用户的模型记录标题。

_rec_name:用来指出引用关联字描述记录的字段,例如多对一关系。默认情况下,它使用name字段,这是模型中常见的字段。但是这个属性允许我们使用任何其他字段来实现这个目的。

_inherit:继承。

_inherits:委托继承。

模型对象的获取

Xodoo模型被保存在一个中央注册中心,它可以引用实例中可用的所有模型类,并且它可以被一个模型名引用。在我们编写的模型方法代码中,可以通过 self.env['x'] 获取一个代表model x的类的引用。(相当于spring托管对象)

模型名称很重要,因为它们是用于访问注册中心的。模型名称的约定规则:用点分隔的小写字母列表。

模型名称必须是全局唯一,通常与模块名相关。

Xodoo中的三种模型

1. 基本模型models.Model

绝大多数Xodoo模型中,类都是基于models.Model类的。 这种类型的模型具有永久的数据库持久性:为它们创建数据库表,并且它们的记录被存储,直到被显式删除。

2. 瞬态模型models.TransientModel

通常用于向导(wizard)。 它们的数据仍然存储在数据库中,但是临时的,一个清理作业定期从这些表中清除旧数据。

3. 抽象模型models.AbstractModel

不存储数据,不会在数据库创建表。 抽象模型作为可重用的功能集,利用Xodoo的继承功能,混入到其他模型。通常用于定义接口或者用作报表模型。

本教程首先熟悉第一种基本模型。

模型之间的关系

常通过关系字段(Many2one、One2many、Many2many)建立模型关系。命名字段时,有以下约定:以_id、_ids为结尾命名的字段,分别对应的是Many2one和One2many的关系。

视图文件结构

views文件夹中xml文件内容通常包含菜单(menuitem)、动作(action)和视图板块(tree、form、search、gantt等)。最简结构如下:

<?xml version="1.0" encoding="utf-8" ?>
<Xodoo>
    <data>
        <!--tree 视图-->
        <record id="Xodoo_tree_test_test" model="ir.ui.view">
            <field name="name">test.test.tree</field>
            <field name="model">test.test</field>
            <field name="arch" type="xml">
                <tree string="列表">
                    <field name="name"/>
                    <field name="description"/>
                </tree>
            </field>
        </record>
        
        <!--form 视图-->
        <record id="Xodoo_form_test_test" model="ir.ui.view">
            <field name="name">test.test.form</field>
            <field name="model">test.test</field>
            <field name="arch" type="xml">
                <form string="表单">
                    <field name="name"/>
                    <field name="description"/>
                </form>
            </field>
        </record>

        <!--action 动作-->
        <record model="ir.actions.act_window" id="test_action">
            <field name="name">测试</field>
            <field name="res_model">test.test</field>
            <field name="view_mode">tree,form</field>
        </record>
        
        <!--菜单,引用action-->
        <menuitem name="我的测试" id="main_test_menu"     action="test_action" sequence="1"/>
    </data>
</Xodoo>

菜单

在前端界面上显示为顶部主菜单栏,可以是多层级

比如:

<!-- 一级菜单 -->
<menuitem id="main_openacademy_menu" name="Open Academy"/>
<!-- 二级菜单 -->
<menuitem id="openacademy_menu" name="Open Academy" parent="main_openacademy_menu"/>
<!-- 三级菜单,并且有action -->
<menuitem id="courses_menu" name="Courses" parent="openacademy_menu" action="course_list_action"/>

每一个菜单都可以触发动作:使用参数action="action_id"

在前端界面上是:

动作

action通过ir.actions.act_window这个模型去创建,触发动作后会跳到视图,使用哪些视图需要写明,比如下面action里添加了列表视图、表单、日历、甘特、图表、看板视图。

<record model="ir.actions.act_window" id="session_list_action">
    <field name="name">Sessions</field>
    <field name="res_model">openacademy.session</field>
    <field name="view_mode">tree,form,calendar,gantt,graph,kanban</field>
</record>

*在Xodoo中,排序是很重要的。整个action这段代码一般放在所有menuitem之前,而具体视图代码块放在action之前。

基本视图

Xodoo支持多样化的视图表现,初级开发者可以定义每一种视图块中具体的字段展示样式,包括小部件(widget)。

视图都通过模型ir.ui.view创建。

最常用的是:

tree视图示例:

<record id="Xodoo_tree_test_test" model="ir.ui.view">
    <field name="name">test.test.tree</field>
    <field name="model">test.test</field>
    <field name="priority">1</field>
    <field name="arch" type="xml">
        <tree string="列表">
            <field name="name"/>
            <field name="description"/>
        </tree>
    </field>
</record>
如上,通常包括:
  • 元素头<record>
  • 规定格式字段name、model等
  • tree视图具体内容

form视图示例:

<record id="form_hr_eval" model="ir.ui.view">
    <field name="name">hr.eval.form</field>
    <field name="model">hr.eval</field>
    <field name="arch" type="xml">
        <form string="表单">
            <sheet>
                <div class="oe_button_box" name="button_box">
                </div>
                <group>
                    <group>
                        <field name="name"  />
                        <field name="job"  />
                        <field name="user_id"  />
                        <field name="department_type" options="{'horizontal': true}" widget="radio"  />
                    </group>
                    <!--两组group可实现分页的作用-->
                    <group>
                        <field name="date_start"/>
                        <field name="date_end"/>
                        <field name="score"/>
                        <field name="rank"/>
                    </group>
                </group>
            </sheet>
        </form>
    </field>
</record>

如上,通常包括:

  • 元素头<record>
  • 规定格式字段name、model等
  • form视图具体内容,也常用notebook、div、group等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DTCloud4

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值