odoo17 4模型视图理解

XML 代码结构概览

这段 XML 代码定义了 my_hostel 模块中 hostel.hostel 模型的两个视图:列表视图 (tree view) 和表单视图 (form view),以及一个动作 (action) 和两个菜单项 (menuitem)。

整体框架

<odoo>
    <data>
        
    data>
odoo>
  • : XML 文件的根元素,表示这是一个 Odoo 的 XML 配置文件。
  • : 包含所有 Odoo 记录 (records) 的容器。 这些记录通常是视图,动作,菜单项等。

记录 (record) 的定义

标签内部,我们使用 标签来定义不同的记录。 每个记录都对应 Odoo 系统中的一条数据。

1. 列表视图 (Tree View) 的定义

<record id="view_hostel_tree" model="ir.ui.view">
    <field name="name">hostel.hostel.treefield>
    <field name="model">hostel.hostelfield>
    <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": 当前记录的唯一标识符 (External ID)。 你应该为每一个 标签都定义一个 id 值,方便在 Odoo 系统中引用。
    • model="ir.ui.view": 表示当前记录的类型是 ir.ui.view,这是 Odoo 中用于存储视图配置的系统模型。
  • hostel.hostel.tree:
    • 定义视图的名称,用于在 Odoo 内部识别该视图。
  • hostel.hostel:
    * 指定该视图所针对的模型为 hostel.hostel 模型。
  • :
    • arch 表示 “architecture”, 定义视图的结构。
    • type="xml" 表示视图结构是用 XML 定义的。
  • :
    • 表示这是一个列表视图,string="Hostel" 指定了列表视图在 UI 中显示的标题。 你可以使用其他的字符串来替换。
  • , , :
    • 在列表视图中显示的字段。
    • name 属性指定了模型中对应的字段。
    • 这些字段将以列的形式展示。

总结:

  • 这个 record 定义了一个列表视图,用于显示 hostel.hostel 模型的数据。
  • 列表视图将显示 namehostel_codemobile 这三个字段。

2. 表单视图 (Form View) 的定义

<record id="view_hostel_form" model="ir.ui.view">
    <field name="name">hostel.hostel.formfield>
    <field name="model">hostel.hostelfield>
    <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>
  • : 类似列表视图,定义了一个类型为 ir.ui.view 的记录, idview_hostel_form
  • hostel.hostel.formhostel.hostel
    • 定义了视图的名称和所针对的模型,与列表视图类似。
  • :
    • 同样表示视图的结构。
  • :
    • 表示这是一个表单视图,string="Hostel" 指定表单视图的标题。
  • :
    • 表示表单视图的主要内容区域,用于包含表单的字段和布局。
    • 一个 div 元素,使用 oe_title CSS 类,通常用于设置表单的主要标题区域。
  • , ,
    : 使用 HTML 表格来布局标题。
  • 使用 h3 标签来显示标题。
  • :
    • 定义表单中要显示的字段。
    • name 属性指定要显示的字段名。
    • required="1" 表示该字段是必填的。
    • placeholder="Name" 表示输入框中的占位符文本。
  • :
    • 用于将字段分组,从而在表单中进行分栏布局。
  • label 标签,用于显示标签文本。
    * for="street" 将标签和 street 字段关联。
    * string="Address" 定义了标签的文本。
  • :
    • 一个 div 元素,使用 o_address_format CSS 类,通常用于显示地址格式的字段。
  • , , , field name="state_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}' 表示禁止创建记录。
  • , ,
    • 这些字段使用 widget 属性指定了 Odoo 的特定 UI 小部件。
    • widget="phone": 将字段显示为电话号码输入框。
    • widget="email": 将字段显示为邮箱地址输入框,并且通过 context="{'gravatar_image': True}" 支持显示头像。
  • 总结:

    • 这个 record 定义了一个表单视图,用于创建和编辑 hostel.hostel 模型的数据。
    • 表单视图的布局使用 sheet 来包含内容。
    • 使用 group 来实现分栏布局。
    • 使用 field 标签显示模型中的字段,以及配置 requiredplaceholderwidget 等属性。
    • 通过classoptions等属性,可以实现 Odoo 特定的样式和功能。

    3. 动作 (Action) 的定义

    <record model="ir.actions.act_window" id="action_hostel">
        <field name="name">Hostelfield>
        <field name="type">ir.actions.act_windowfield>
        <field name="res_model">hostel.hostelfield>
        <field name="view_mode">tree,formfield>
        <field name="help" type="html">
            <p class="oe_view_nocontent_create">
                Create Hostel.
            p>
        field>
    record>
    
    • :
      • 定义一个类型为 ir.actions.act_window 的记录, idaction_hostel
      • ir.actions.act_window 是 Odoo 中用于创建动作的系统模型。
    • Hostel
      • 定义了动作的名称,用于在 Odoo 中显示。
    • ir.actions.act_window:
      * 指定了动作的类型是 ir.actions.act_window (一个打开窗口的动作)。
    • hostel.hostel
      • 定义了动作对应的模型为 hostel.hostel 模型。
    • tree,form:
      • 指定该动作可以使用的视图模式:列表视图 (tree) 和表单视图 (form)。

    • * help 属性定义了动作的帮助文本, type="html" 表示帮助文本以 HTML 格式定义。
      • Create Hostel.

        定义了当列表中没有记录时,显示的提示文字。

    总结:

    • 这个 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"/>
    
    • :
      • id="hostel_main_menu" 定义了菜单项的唯一标识符。
      • name="Hostel" 定义菜单项显示的名称。
      • 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 结构, , , 等 XML 标签及其嵌套关系。
      • Odoo 模型的定义: ir.ui.view, ir.actions.act_window, 和 menuitem 等。
      • 外部标识符: . 的格式,用于唯一标识记录。
      • id 属性的定义,每个 record 都需要一个唯一的 id
      • model 属性,指定 record 的类型,比如 ir.ui.view
      • 视图使用 arch 来描述视图的结构, 并且定义 type="xml"
      • namestringmodelres_model 等属性在不同场景下的含义。
      • widgetcontext 等属性的使用。
      • 各种 UI 组件 ( div , table, tr, td, h1,h3,label, field, group)的用法。
      • 菜单项的idnameparentactiongroupssequence 的用法。
    • 可以理解的:
      • 视图的布局:你可以根据自己的需求调整表单视图的字段布局,可以使用 group 来实现分栏,也可以使用 div, table 等标签来组织内容。
      • 字段的属性:你可以根据需求设置字段的 requiredplaceholderwidget 等属性。
      • 菜单项的名称:你可以自定义菜单项的 namesequence 属性。
      • 视图的 string 属性: 你可以自定义视图的标题。

    你可能感兴趣的:(Odoo17学习,java,前端,odoo)