XML 代码结构概览
这段 XML 代码定义了 my_hostel
模块中 hostel.hostel
模型的两个视图:列表视图 (tree view) 和表单视图 (form view),以及一个动作 (action) 和两个菜单项 (menuitem)。
整体框架
<odoo>
<data>
<!-- 这里放各种记录的定义 -->
</data>
</odoo>
<odoo>
: XML 文件的根元素,表示这是一个 Odoo 的 XML 配置文件。<data>
: 包含所有 Odoo 记录 (records) 的容器。 这些记录通常是视图,动作,菜单项等。
记录 (record) 的定义
在 <data>
标签内部,我们使用 <record>
标签来定义不同的记录。 每个记录都对应 Odoo 系统中的一条数据。
1. 列表视图 (Tree View) 的定义
<record id="view_hostel_tree" model="ir.ui.view">
<field name="name">hostel.hostel.tree</field>
<field name="model">hostel.hostel</field>
<field name="arch" type="xml">
<tree string="Hostel">
<field name="name"/>
<field name="hostel_code"/>
<field name="mobile"/>
</tree>
</field>
</record>
<record id="view_hostel_tree" model="ir.ui.view">
:record
: 定义一条记录。id="view_hostel_tree"
: 当前记录的唯一标识符 (External ID)。 你应该为每一个<record>
标签都定义一个id
值,方便在 Odoo 系统中引用。model="ir.ui.view"
: 表示当前记录的类型是ir.ui.view
,这是 Odoo 中用于存储视图配置的系统模型。
<field name="name">hostel.hostel.tree</field>
:- 定义视图的名称,用于在 Odoo 内部识别该视图。
<field name="model">hostel.hostel</field>
:
* 指定该视图所针对的模型为hostel.hostel
模型。<field name="arch" type="xml">
:arch
表示 “architecture”, 定义视图的结构。type="xml"
表示视图结构是用 XML 定义的。
<tree string="Hostel">
:- 表示这是一个列表视图,
string="Hostel"
指定了列表视图在 UI 中显示的标题。 你可以使用其他的字符串来替换。
- 表示这是一个列表视图,
<field name="name"/>
,<field name="hostel_code"/>
,<field name="mobile"/>
:- 在列表视图中显示的字段。
name
属性指定了模型中对应的字段。- 这些字段将以列的形式展示。
总结:
- 这个
record
定义了一个列表视图,用于显示hostel.hostel
模型的数据。 - 列表视图将显示
name
,hostel_code
和mobile
这三个字段。
2. 表单视图 (Form View) 的定义
<record id="view_hostel_form" model="ir.ui.view">
<field name="name">hostel.hostel.form</field>
<field name="model">hostel.hostel</field>
<field name="arch" type="xml">
<form string="Hostel">
<sheet>
<div class="oe_title">
<h3>
<table>
<tr>
<td style="padding-right:10px;"><field name="name" required="1"
placeholder="Name" /></td>
<td style="padding-right:10px;"><field name="hostel_code"
placeholder="Code" /></td>
</tr>
</table>
</h3>
</div>
<group>
<group>
<label for="street" string="Address"/>
<div class="o_address_format">
<field name="street" placeholder="Street..." class="o_address_street"/>
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
<field name="city" placeholder="City" class="o_address_city"/>
<field name="state_id" class="o_address_state" placeholder="State"
options='{"no_open": True}'/>
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
<field name="country_id" placeholder="Country"
class="o_address_country" options='{"no_open": True, "no_create": True}'/>
</div>
</group>
<group>
<field name="phone" widget="phone"/>
<field name="mobile" widget="phone"/>
<field name="email" widget="email" context="{'gravatar_image': True}"/>
</group>
</group>
</sheet>
</form>
</field>
</record>
<record id="view_hostel_form" model="ir.ui.view">
: 类似列表视图,定义了一个类型为ir.ui.view
的记录,id
为view_hostel_form
。<field name="name">hostel.hostel.form</field>
和<field name="model">hostel.hostel</field>
:- 定义了视图的名称和所针对的模型,与列表视图类似。
<field name="arch" type="xml">
:- 同样表示视图的结构。
<form string="Hostel">
:- 表示这是一个表单视图,
string="Hostel"
指定表单视图的标题。
- 表示这是一个表单视图,
<sheet>
:- 表示表单视图的主要内容区域,用于包含表单的字段和布局。
<div class="oe_title">
:- 一个
div
元素,使用oe_title
CSS 类,通常用于设置表单的主要标题区域。
- 一个
<table>
,<tr>
,<td>
: 使用 HTML 表格来布局标题。<h3>
:- 使用
h3
标签来显示标题。 <field name="name" required="1" placeholder="Name" />
和<field name="hostel_code" placeholder="Code" />
:- 定义表单中要显示的字段。
name
属性指定要显示的字段名。required="1"
表示该字段是必填的。placeholder="Name"
表示输入框中的占位符文本。
<group>
:- 用于将字段分组,从而在表单中进行分栏布局。
<label for="street" string="Address"/>
label
标签,用于显示标签文本。
*for="street"
将标签和street
字段关联。
*string="Address"
定义了标签的文本。<div class="o_address_format">
:- 一个
div
元素,使用o_address_format
CSS 类,通常用于显示地址格式的字段。
- 一个
<field name="street" .../>
,<field name="street2" .../>
,<field name="city" .../>
,field name="state_id" .../>
,<field name="zip" .../>
,<field name="country_id" .../>
- 定义了地址相关的字段,使用
class
属性来指定 CSS 类,以实现特定的样式。 class="o_address_street"
,class="o_address_city"
,class="o_address_state"
,class="o_address_zip"
,class="o_address_country"
表示使用 Odoo 的地址样式。options='{"no_open": True}'
表示在选择时,不打开相关记录的表单视图,使用弹出选择框。options='{"no_open": True, "no_create": True}'
表示禁止创建记录。
- 定义了地址相关的字段,使用
<field name="phone" widget="phone"/>
,<field name="mobile" widget="phone"/>
,<field name="email" widget="email" context="{'gravatar_image': True}"/>
:- 这些字段使用
widget
属性指定了 Odoo 的特定 UI 小部件。 widget="phone"
: 将字段显示为电话号码输入框。widget="email"
: 将字段显示为邮箱地址输入框,并且通过context="{'gravatar_image': True}"
支持显示头像。
- 这些字段使用
总结:
- 这个
record
定义了一个表单视图,用于创建和编辑hostel.hostel
模型的数据。 - 表单视图的布局使用
sheet
来包含内容。 - 使用
group
来实现分栏布局。 - 使用
field
标签显示模型中的字段,以及配置required
,placeholder
和widget
等属性。 - 通过
class
和options
等属性,可以实现 Odoo 特定的样式和功能。
3. 动作 (Action) 的定义
<record model="ir.actions.act_window" id="action_hostel">
<field name="name">Hostel</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">hostel.hostel</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Create Hostel.
</p>
</field>
</record>
<record model="ir.actions.act_window" id="action_hostel">
:- 定义一个类型为
ir.actions.act_window
的记录,id
为action_hostel
。 ir.actions.act_window
是 Odoo 中用于创建动作的系统模型。
- 定义一个类型为
<field name="name">Hostel</field>
:- 定义了动作的名称,用于在 Odoo 中显示。
<field name="type">ir.actions.act_window</field>
:
* 指定了动作的类型是ir.actions.act_window
(一个打开窗口的动作)。<field name="res_model">hostel.hostel</field>
:- 定义了动作对应的模型为
hostel.hostel
模型。
- 定义了动作对应的模型为
<field name="view_mode">tree,form</field>
:- 指定该动作可以使用的视图模式:列表视图 (
tree
) 和表单视图 (form
)。
- 指定该动作可以使用的视图模式:列表视图 (
<field name="help" type="html">
*help
属性定义了动作的帮助文本,type="html"
表示帮助文本以 HTML 格式定义。<p class="oe_view_nocontent_create"> Create Hostel.</p>
定义了当列表中没有记录时,显示的提示文字。
总结:
- 这个
record
定义了一个动作,用于打开一个窗口来管理hostel.hostel
模型的数据。 - 该动作支持列表视图和表单视图。
- 提供了帮助文本。
4. 菜单项 (Menuitem) 的定义
<menuitem id="hostel_main_menu" name="Hostel" sequence="1"/>
<menuitem id="hostel_type_menu" name="Hostel" parent="hostel_main_menu"
action="my_hostel.action_hostel" groups="my_hostel.group_hostel_manager"
sequence="1"/>
<menuitem id="hostel_main_menu" name="Hostel" sequence="1"/>
:id="hostel_main_menu"
定义了菜单项的唯一标识符。name="Hostel"
定义菜单项显示的名称。sequence="1"
定义了菜单项在同级菜单中的顺序。
<menuitem id="hostel_type_menu" name="Hostel" parent="hostel_main_menu" action="my_hostel.action_hostel" groups="my_hostel.group_hostel_manager" sequence="1"/>
:id="hostel_type_menu"
定义了菜单项的唯一标识符。name="Hostel"
定义菜单项显示的名称。parent="hostel_main_menu"
定义了父菜单,表示此菜单项是hostel_main_menu
的子菜单项。action="my_hostel.action_hostel"
将此菜单项与之前定义的action_hostel
动作关联。groups="my_hostel.group_hostel_manager"
表示只有属于my_hostel.group_hostel_manager
用户组的用户才能看到此菜单项。sequence="1"
定义了菜单项在同级菜单中的顺序。
总结:
hostel_main_menu
定义一个主菜单,用于在 Odoo 菜单中显示。hostel_type_menu
定义一个子菜单,并且该子菜单只有属于my_hostel.group_hostel_manager
用户组的用户才能看到,点击该菜单将打开action_hostel
动作。
需要记住的规范和可以理解的
- 需要记住的规范:
- XML 结构:
<odoo>
,<data>
,<record>
,<field>
等 XML 标签及其嵌套关系。 - Odoo 模型的定义:
ir.ui.view
,ir.actions.act_window
, 和menuitem
等。 - 外部标识符:
<module_name>.<unique_name>
的格式,用于唯一标识记录。 id
属性的定义,每个record
都需要一个唯一的id
。model
属性,指定record
的类型,比如ir.ui.view
。- 视图使用
arch
来描述视图的结构, 并且定义type="xml"
。 name
,string
,model
,res_model
等属性在不同场景下的含义。widget
和context
等属性的使用。- 各种 UI 组件 (
div
,table
,tr
,td
,h1
,h3
,label
,field
,group
)的用法。 - 菜单项的
id
,name
,parent
,action
,groups
和sequence
的用法。
- XML 结构:
- 可以理解的:
- 视图的布局:你可以根据自己的需求调整表单视图的字段布局,可以使用
group
来实现分栏,也可以使用div
,table
等标签来组织内容。 - 字段的属性:你可以根据需求设置字段的
required
,placeholder
,widget
等属性。 - 菜单项的名称:你可以自定义菜单项的
name
和sequence
属性。 - 视图的
string
属性: 你可以自定义视图的标题。
- 视图的布局:你可以根据自己的需求调整表单视图的字段布局,可以使用