Odoo视图与搜索筛选

wen PHP项目 2

本文目录导读:

Odoo视图与搜索筛选

  1. Odoo 视图 (Views)
  2. 搜索筛选 (Search & Filters)
  3. 视图与搜索筛选的协同工作
  4. 常见问题与优化建议

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> 默认两列,嵌套则形成多列)。
  • notebookpage:创建页签式布局。
  • header:在表单顶部放置按钮(如“确认”、“取消”),通常与状态栏 statusbar 配合。

视图优先级與继承

  • 视图优先级sequence 字段决定视图在视图选择器中的顺序(低值优先显示)。
  • 视图继承:通过 inherit_id 引用父视图,使用 xpathfield 定位元素,实现模块间视图扩展。
    <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 中,typesearch

<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" 等可以改变字段输入方式。


视图与搜索筛选的协同工作

视图和搜索筛选紧密耦合:

  1. 默认搜索域:在动作(Action)中定义 domaincontext,可限制视图初始显示的数据范围。
  2. 上下文传递:搜索视图通过 context 影响视图渲染(如隐藏字段、更改按钮状态、设置字段默认值)。
  3. 动态刷新:当用户更改筛选条件时,视图自动重新加载数据。
  4. 分组视图联动:分组筛选 (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 界面,满足业务需求,如果你有具体的定制场景(如自定义一个图形视图、实现复杂的搜索逻辑),欢迎继续提问!

抱歉,评论功能暂时关闭!