如何在 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、清单配置与原文保持一致未做改动。