跳至内容

Odoo 20 开发教程:自定义模块搭建表单视图完整流程

2026年10月19日 由
Odoo 20 开发教程:自定义模块搭建表单视图完整流程
中国 Odoo, 苏州远鼎

如何在 Odoo 20 中创建表单视图(Form View)

Odoo 支持多种视图,以便以用户友好的方式表示和管理业务数据。表单视图(Form View)用于表示和修改数据库中的记录。例如,当打开一条客户记录、产品记录、员工记录和销售订单记录时,Odoo 都会以表单视图的形式来展示该记录。

在 Odoo 中,表单视图通过 XML 文件和模型名称来创建。开发者可以将字段分组,并把它们放入不同的标签页和按钮中,从而按照自己的便利来定制界面。

在本篇博客中,我们将学习如何在 Odoo 20 中通过一个自定义模块来创建表单视图。

创建模型

我们先从构建一个非常简单的模型开始,命名为 library.book。

在 models 文件夹内创建一个 Python 文件:

from odoo import fields, models

 

class LibraryBook(models.Model):

    _name = "library.book"

    _description = "Library Book"

    name = fields.Char(string="Book Title", required=True)

    author = fields.Char(string="Author")

    isbn = fields.Char(string="ISBN")

    published_date = fields.Date(string="Published Date")

    price = fields.Float(string="Price")

    description = fields.Text(string="Description")

在这里,我们开发了一个带有若干基本字段的模型,这些字段将显示在我们的表单视图中。

请确保已在 models/__init__.py 中导入该模型:

from . import library_book

配置访问权限

在创建表单视图之前,我们必须先向用户授予对 library.book 模型的访问权限。在 Odoo 20 中,访问权限可以通过 ir.access.csv 文件来创建。

在模块中创建一个 security 文件夹,并创建如下文件:

id,name,model_id,group_id/id,operation,domain

access_library_book_user,library_book_user,library.book,base.group_user,crud,

创建表单视图

现在在 view 文件夹中创建一个 XML 文件,如下所示:

views/library_book_views.xml

添加如下表单视图:

<?xml version="1.0" encoding="utf-8"?>

<odoo>

    <record id="view_library_book_form" model="ir.ui.view">

        <field name="name">library.book.form</field>

        <field name="model">library.book</field>

        <field name="arch" type="xml">

            <form>

                <sheet>

                    <group>

                        <field name="name"/>

                        <field name="author"/>

                        <field name="isbn"/>

                        <field name="published_date"/>

                        <field name="price"/>

                    </group>

                    <group>

                        <field name="description"/>

                    </group>

                </sheet>

            </form>

        </field>

    </record>

</odoo>

下面我们来看一下该定义中的几个重要部分。

该视图被定义为一个 ir.ui.view 对象:

<record id="view_library_book_form" model="ir.ui.view">

model 字段指明了将用于创建表单视图的模型:

<field name="model">library.book</field>

实际的视图结构(architecture)设置在 arch 属性内:

<field name="arch" type="xml">

<form> 标签用于创建表单视图的结构。<sheet> 标签可用于提供表单的主体部分。在 sheet 内部,<group> 标签用于将字段组织成结构化的表单布局。例如:

<group>

    <field name="name"/>

    <field name="author"/>

    <field name="isbn"/>

</group>

当表单包含多种数据字段时,字段也可以被分配到多个 group 中。

向 Notebook 添加标签页

如果表单包含更多信息,可以使用 notebook 标签页来划分不同区域。例如:

<notebook>

    <page string="Additional Information">

        <field name="description"/>

    </page>

</notebook>

<notebook> 会生成一个带标签页的容器,而 <page> 则表示其中的一个独立标签页。

因此,我们的表单视图可以修改为:

<form>

    <sheet>

        <group>

            <group>

                <field name="name"/>

                <field name="author"/>

                <field name="isbn"/>

            </group>

            <group>

                <field name="published_date"/>

                <field name="price"/>

            </group>

        </group>

        <notebook>

            <page string="Description">

                <field name="description"/>

            </page>

        </notebook>

    </sheet>

</form>

这让图书模板的外观变得更加有条理。

创建列表视图和窗口动作

为了在 Odoo 界面中拥有表单视图,我们还需要一个列表视图和一个窗口动作(window action)。

列表视图如下:

<record id="view_library_book_list" model="ir.ui.view">

    <field name="name">library.book.list</field>

    <field name="model">library.book</field>

    <field name="arch" type="xml">

        <list>

            <field name="name"/>

            <field name="author"/>

            <field name="isbn"/>

            <field name="published_date"/>

        </list>

    </field>

</record>

现在创建一个动作:

<record id="action_library_book" model="ir.actions.act_window">

    <field name="name">Library Books</field>

    <field name="res_model">library.book</field>

    <field name="view_mode">list,form</field>

</record>

view_mode 表示用户可以同时使用列表视图和表单视图。

最后,创建一个菜单项:

<menuitem id="menu_library_root" name="Library" sequence="10"/>

<!-- Books Menu -->

<menuitem id="menu_library_books" name="Books" parent="menu_library_root" action="action_library_book"

          sequence="10"/>

因此,完整的 XML 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>

<odoo>

    <record id="view_library_book_form" model="ir.ui.view">

        <field name="name">library.book.form</field>

        <field name="model">library.book</field>

        <field name="arch" type="xml">

            <form>

                <sheet>

                    <group>

                        <group>

                            <field name="name"/>

                            <field name="author"/>

                            <field name="isbn"/>

                        </group>

                        <group>

                            <field name="published_date"/>

                            <field name="price"/>

                        </group>

                    </group>

                    <notebook>

                        <page string="Description">

                            <field name="description"/>

                        </page>

                    </notebook>

                </sheet>

            </form>

        </field>

    </record>

 

    <record id="view_library_book_list" model="ir.ui.view">

        <field name="name">library.book.list</field>

        <field name="model">library.book</field>

        <field name="arch" type="xml">

            <list>

                <field name="name"/>

                <field name="author"/>

                <field name="isbn"/>

                <field name="published_date"/>

            </list>

        </field>

    </record>

 

    <!-- Window Action -->

    <record id="action_library_book" model="ir.actions.act_window">

        <field name="name">Library Books</field>

        <field name="res_model">library.book</field>

        <field name="view_mode">list,form</field>

    </record>

 

    <!-- Root Menu -->

    <menuitem id="menu_library_root" name="Library" sequence="10"/>

    <!-- Books Menu -->

    <menuitem id="menu_library_books" name="Books" parent="menu_library_root" action="action_library_book"

              sequence="10"/>

</odoo>

将 XML 文件加入清单(Manifest)

必须将该 XML 文件加入到模块的 __manifest__.py 中:

{

    "name": "Library Management",

    "version": "20.0.1.0.0",

    "depends": ["base"],

    "data": [

        "security/ir.access.csv",

        "views/library_book_views.xml",

    ],

    "installable": True,

    "application": True,

}

在将 XML 文件加入清单后,必须重启 Odoo 服务器并更新该模块。

安装模块后,进入"Library Books"菜单。此时会显示图书列表,点击任意一条记录,即可看到表单视图。

表单是 Odoo 模块创建中不可或缺的一部分,因为表单负责处理单条记录。借助 XML 文件,开发者可以在表单中创建分区、标签页,并将表单绑定到动作和菜单上。

在 Odoo 20 中创建一个简单的表单视图,涉及创建一条 ir.ui.view 记录,并使用 XML 定义模型和表单结构。掌握表单的基础之后,就可以用新的组件对表单进行扩展。

翻译说明:按您要求忠实直译,代码块、字段名、XML 标签、CSV、清单配置与原文保持一致未做改动。

 

Odoo 20 开发教程:自定义模块搭建表单视图完整流程
中国 Odoo, 苏州远鼎 2026年10月19日
标签
存档