当前位置: 首页 > article >正文

odoo17 4模型视图理解

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 模型的数据。
  • 列表视图将显示 namehostel_codemobile 这三个字段。

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 的记录, idview_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 标签显示模型中的字段,以及配置 requiredplaceholderwidget 等属性。
  • 通过classoptions等属性,可以实现 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 的记录, idaction_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"
    • namestringmodelres_model 等属性在不同场景下的含义。
    • widgetcontext 等属性的使用。
    • 各种 UI 组件 ( div , table, tr, td, h1,h3,label, field, group)的用法。
    • 菜单项的idnameparentactiongroupssequence 的用法。
  • 可以理解的:
    • 视图的布局:你可以根据自己的需求调整表单视图的字段布局,可以使用 group 来实现分栏,也可以使用 div, table 等标签来组织内容。
    • 字段的属性:你可以根据需求设置字段的 requiredplaceholderwidget 等属性。
    • 菜单项的名称:你可以自定义菜单项的 namesequence 属性。
    • 视图的 string 属性: 你可以自定义视图的标题。

http://www.kler.cn/a/460806.html

相关文章:

  • springboot集成阿里云短信服务
  • JavaWeb开发(五)Servlet-ServletContext
  • 推理加速:投机采样经典方法
  • LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作
  • C++类对象内存对齐方式
  • SSRF服务端请求Gopher伪协议白盒测试
  • 小程序组件 —— 21组件案例演示 - 划分页面结构
  • 小米自研vela系统kvdb数据库的使用(一)
  • 微信小程序Uniapp
  • 基于Spark的共享单车数据存储系统的设计与实现_springboot+vue
  • UniApp 状态管理:Vuex 在 UniApp 中的实践
  • 【Linux】linux 清空文件内容命令和方法
  • 2024年总结与展望
  • 汽车打气泵方案|智能充气泵工作原理
  • vulnhub ica1
  • 论文略读: TransTab: Learning Transferable Tabular Transformers Across Tables
  • Datawhale AI冬令营(第二期)动手学AI Agent task2--学Prompt工程,优化Agent效果
  • 7个国内框架 Agent应用
  • Qt 教程全集目录公布(方便查阅2024)
  • 前端Python应用指南(八)WebSocket与实时应用:用Flask和Django实现聊天系统
  • Java中实现对象的深拷贝(Deep Copy)
  • LeetCode 3219.切蛋糕的最小总开销 II:贪心——先切贵的
  • 计算机毕业设计Hadoop+Spark美团美食推荐系统 美团餐厅推荐系统 美团推荐系统 美食价格预测 美团爬虫 美食数据分析 美食可视化大屏
  • Android Studio 安装教程
  • httpslocalhostindex 配置的nginx,一刷新就报404了
  • Java系列之:读写文件、Callable接口、Runnable接口、线程池