本文目录导读:

Odoo 视图 (Views)
Odoo 视图决定了数据在屏幕上的呈现方式,它们是 XML 文件,定义了字段布局、分组、图表等。
常见视图类型
- Tree View (列表视图):以表格形式展示多条记录,支持列排序、行点击、批量操作。
- Form View (表单视图):展示单条记录的详细信息,是用户编辑或查看数据的主要界面,可以包含页签(Notebook)、分组(Group)、嵌入视图(如子列表)等复杂布局。
- Kanban View (看板视图):以卡片形式展示记录,适合工作流管理(如销售管道、项目任务)。
- Graph View (图形视图):以图表(柱状图、饼图、折线图)显示聚合数据(如按销售员统计销售额)。
- Pivot View (数据透视表视图):动态交叉分析数据,支持拖拽行/列字段(如按月份和产品类别汇总订单量)。
- Calendar View (日历视图):将记录展示在日历上(如会议、任务、请假)。
- Map View (地图视图):基于地址或经纬度字段,在地图上标记记录(如客户位置)。
- QWeb View (看板/报表视图):使用 QWeb 模板引擎自定义布局,常与看板视图中的渲染逻辑配合。
视图的基本XML结构
以表单视图为例:
<record id="view_order_form" model="ir.ui.view">
<field name="name">sale.order.form</field> <!-- 视图名称,用于内部识别 -->
<field name="model">sale.order</field> <!-- 绑定的模型 -->
<field name="arch" type="xml"> <!-- 视图架构定义 -->
<form string="销售订单">
<sheet> <!-- 主内容区域 -->
<group> <!-- 分组布局 -->
<group>
<field name="name" string="订单编号"/>
<field name="partner_id"/>
<field name="date_order"/>
</group>
<group>
<field name="user_id"/>
<field name="state" widget="statusbar"/>
</group>
</group>
<notebook> <!-- 页签 -->
<page string="订单行">
<field name="order_line"> <!-- 嵌入子视图 -->
<tree> <!-- 子列表视图 -->
<field name="product_id"/>
<field name="product_uom_qty"/>
<field name="price_unit"/>
<field name="price_subtotal" sum="小计金额"/>
</tree>
</field>
</page>
<page string="其他信息">
...
</page>
</notebook>
</sheet>
</form>
</field>
</record>
关键属性与元素
string(视图头、页签名)。widget:字段展示小部件(如statusbar状态条,many2many_tags标签选择器,monetary货币金额,percentage百分比,selection_badge带颜色的选择标签)。invisible/readonly/required:条件性控制字段显示/编辑,可用attrs="{'invisible': [('state', '=', 'done')]}"基于条件动态控制。group:水平分组(<group>默认两列,嵌套则形成多列)。notebook与page:创建页签式布局。header:在表单顶部放置按钮(如“确认”、“取消”),通常与状态栏statusbar配合。
视图优先级與继承
- 视图优先级:
sequence字段决定视图在视图选择器中的顺序(低值优先显示)。 - 视图继承:通过
inherit_id引用父视图,使用xpath或field定位元素,实现模块间视图扩展。<record id="inherited_view_order_form" model="ir.ui.view"> <field name="name">sale.order.form.inherit</field> <field name="model">sale.order</field> <field name="inherit_id" ref="sale.view_order_form"/> <field name="arch" type="xml"> <xpath expr="//field[@name='partner_id']" position="after"> <field name="x_custom_field"/> </xpath> </field> </record>
搜索筛选 (Search & Filters)
Odoo 的搜索视图(search)允许用户通过字段值、预设筛选器、分组和高级查询来过滤数据。
搜索视图结构 (Search View)
定义在 ir.ui.view 中,type 为 search:
<record id="view_sale_order_filter" model="ir.ui.view">
<field name="name">sale.order.select</field>
<field name="model">sale.order</field>
<field name="arch" type="xml">
<search string="搜索销售订单">
<!-- 字段搜索 -->
<field name="name" string="订单编号"/>
<field name="partner_id" string="客户"/>
<!-- 预设筛选器 -->
<filter name="my_orders" string="我的订单"
domain="[('user_id', '=', uid)]"/>
<!-- uid 是一个上下文变量,代表当前用户 ID -->
<filter name="today_orders" string="今日订单"
domain="[('date_order', '>=', context_today() )]"/>
<!-- context_today() 返回今天日期 -->
<filter name="high_amount" string="高金额"
domain="[('amount_total', '>', 10000)]"/>
<!-- 分组 (Group By) -->
<group expand="0" string="按状态分组">
<filter name="group_state" string="状态"
domain="[]" context="{'group_by': 'state'}"/>
</group>
<filter name="group_user" string="按销售员"
context="{'group_by': 'user_id'}"/>
<!-- 分隔符 (separator) 用于分组筛选器 -->
<separator/>
<filter name="archived" string="已归档"
domain="[('active', '=', False)]"/>
</search>
</field>
</record>
核心元素
<field>:在搜索框中创建可搜索的字段输入区,支持operator(默认ilike)、filter_domain(自定义搜索逻辑,如[('name', 'like', self)])。<filter>:定义预设的筛选条件。domain:筛选的领域表达式(如[('state', '=', 'done')])。context:设置上下文变量,常用于分组({'group_by': 'field_name'})或临时更改搜索行为。name:筛选器的内部标识,可通过 URL 参数?search=name激活。inverse:生成一个反向筛选器(一键切换状态,如“我的订单”/“非我的订单”)。
<group>:将多个筛选器或分组条件包装在一起,在 UI 中形成一个下拉菜单或分组区域。<separator>:在筛选器间添加视觉分隔。<searchpanel>:在列表/看板视图左侧创建侧边筛选面板,适用于快速过滤(如按阶段、客户类别分组统计)。
高级筛选技巧
-
使用
context变量:search_default_xxx:让某个筛选器默认激活(如<field name="search_default_my_orders"/>在动作定义中设置)。active_test:设为False可包含已归档记录(即使模型有active字段)。
-
日期范围筛选:利用快捷日期变量
context_today(),datetime.now(),current_month()等构造动态域。 -
自定义搜索域 (Filter Domain):
<filter name="custom_search" string="自定义" domain="['|', ('user_id', '=', uid), ('partner_id.parent_id', '=', False)]"/>此示例使用 操作符实现 或 逻辑。
-
客户化搜索控件:通过
widget="selection"等可以改变字段输入方式。
视图与搜索筛选的协同工作
视图和搜索筛选紧密耦合:
- 默认搜索域:在动作(Action)中定义
domain和context,可限制视图初始显示的数据范围。 - 上下文传递:搜索视图通过
context影响视图渲染(如隐藏字段、更改按钮状态、设置字段默认值)。 - 动态刷新:当用户更改筛选条件时,视图自动重新加载数据。
- 分组视图联动:分组筛选 (
group_by) 不仅影响 Tree/Form 视图的行分组,还能自动在 Graph 视图和 Pivot 视图中生成对应的聚合维度。
常见问题与优化建议
- 性能优化:避免在
domain中使用复杂的datetime函数(如datetime.combine),使用 Odoo 提供的快捷表达式或safe_eval能处理的简单逻辑。 - 视图加载慢:减少视图中的字段数量、避免嵌入多层嵌套视图、在 Tree 视图中慎用
sum等聚合。 - 搜索不生效:检查字段的
searchable="True"属性(默认True),确认域语法正确(特别是多字段组合的 符号位置)。 - 筛选器冲突:多个
filter的域默认是 与(AND)关系,如需实现条件 OR,需使用 操作符自行构建复杂域。
| 组件 | 核心作用 | 关键元素 | 注意事项 |
|---|---|---|---|
| 视图 | 数据展示与交互 | <form>, <tree>, <kanban>, <group>, <notebook>, <field> |
性能、结构清晰度、字段排序 |
| 搜索筛选 | 数据过滤与快速定位 | <field>, <filter>, <group>, <searchpanel>, domain, context |
域逻辑、上下文传递、默认激活 |
掌握这些核心概念后,你就能灵活配置 Odoo 界面,满足业务需求,如果你有具体的定制场景(如自定义一个图形视图、实现复杂的搜索逻辑),欢迎继续提问!