本文目录导读:

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 界面,满足业务需求,如果你有具体的定制场景(如自定义一个图形视图、实现复杂的搜索逻辑),欢迎继续提问!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播