odoo17开发教程(10):自定义搜索

本文介绍了Odoo中搜索视图的工作原理,包括如何定义域来筛选搜索条件,以及如何在estate_property_views.xml中添加自定义搜索功能,如字段过滤、分组和预定义搜索。
摘要由CSDN通过智能技术生成

目录

搜索视图的简介

"域 "domain的概念

实践,为我们的模块添加搜索


搜索视图的简介

搜索视图与列表和表单视图略有不同,因为它们不显示内容。虽然它们适用于特定的模型,但它们用于过滤其他视图的内容(通常是聚合视图,如列表)。除了用例不同外,它们的定义方式是一样的。

它们的根元素是 <search>。该视图的最基本版本只是列出需要快捷方式的所有字段:

<search string="Tests">
    <field name="name"/>
    <field name="last_seen"/>
</search>

Odoo 生成的默认搜索视图提供了按名称过滤的快捷方式。在自定义搜索视图中添加用户可能过滤的字段是很常见的。

搜索视图还可以包含 <filter> 元素,作为预定义搜索的切换器。过滤器必须具有以下属性之一:

  • 域domain:将给定域添加到当前搜索中
  • context:为当前搜索添加一些上下文;使用关键字 group_by 对给定字段名的结果进行分组

让我们看一个源码中的实例:

        <record id="view_delivery_carrier_search" model="ir.ui.view">
            <field name="name">delivery.carrier.search</field>
            <field name="model">delivery.carrier</field>
            <field name="arch" type="xml">
                <search string="Delivery Carrier">
                    <field name="name" string="Carrier" />
                    <field name="delivery_type"/>
                    <separator/>
                    <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
                    <group expand="1" string="Group By">
                        <filter string="Provider" name="provider" context="{'group_by':'delivery_type', 'residual_visible':True}"/>
                    </group>
                </search>
            </field>
        </record>

 这段代码是用于Odoo框架中,定义了一个用于搜索“送货承运人”(Delivery Carrier)的视图。

  • <record id="view_delivery_carrier_search" model="ir.ui.view">:这行定义了一个新的记录,表示一个界面视图。id属性为这个视图定义了一个唯一标识符,而model属性指定了这是一个界面视图(ir.ui.view)。

  • <field name="name">delivery.carrier.search</field>:指定了视图的名字,这里是delivery.carrier.search

  • <field name="model">delivery.carrier</field>:指定了这个搜索视图关联的模型(数据库表)是delivery.carrier,即送货承运人。

  • <field name="arch" type="xml">:定义了视图的结构,type="xml"指明了下面的描述将会是XML格式。

  • <search string="Delivery Carrier">:定义了一个搜索界面,string属性提供了这个搜索界面的标签或标题。

  • <field name="name" string="Carrier" />:在搜索界面上添加了一个字段,允许用户根据承运人的名称(name)来搜索。string="Carrier"定义了在界面上显示的标签。

  • <field name="delivery_type"/>:允许用户基于delivery_type字段来搜索。

  • <separator/>:添加了一个分隔符,用于视觉上区分不同的搜索条件部分。

  • <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>:定义了一个过滤器,允许用户筛选出已归档的承运人记录。这是通过在搜索中添加一个条件,即字段active等于False来实现的。

  • <group expand="1" string="Group By">:定义了一个分组过滤器,允许用户按照特定字段对搜索结果进行分组。expand="1"表示这个分组默认是展开的。

  • <filter string="Provider" name="provider" context="{'group_by':'delivery_type', 'residual_visible':True}"/>:在分组中定义了一个过滤器,允许用户按delivery_type字段进行分组,residual_visible:True`表示即使某些分组没有符合条件的记录,也会在界面上显示。

"域 "domain的概念

在 Odoo 中,domain是用来解析搜索条件的:域是用于选择模型记录子集的标准列表。每个标准都是一个三元组,包含一个字段名称、一个运算符和一个值。如果指定的字段满足应用于值的运算符的条件,则记录满足标准。

例如,在产品模型中使用以下域时,会选择单价大于 1000 的所有服务:

[('product_type', '=', 'service'), ('unit_price', '>', 1000)]

默认情况下,标准与隐式 AND 结合,这意味着每条标准都必须满足,记录才能与域匹配。逻辑运算符 & (AND)、| (OR) 和 !(NOT) 可用于显式组合标准。它们在前缀位置使用(操作符插入在参数之前,而不是参数之间)。例如,选择 "服务或单价不在 1000 和 2000 之间 "的产品:

['|',
    ('product_type', '=', 'service')、
    '!', '&',
        ('unit_price', '>=', 1000)、
        ('unit_price', '<', 2000)] ('单价', '<', 2000

实践,为我们的模块添加搜索

在estate_property_views.xml中添加如下代码

<record id="view_estate_property_search" model="ir.ui.view">
        <field name="name">estate_property</field>
        <field name="model">estate_property</field>
        <field name="arch" type="xml">
            <search string="estate_property">
                <field name="bedrooms" />
                <field name="postcode" />
                <field name="living_area" />
                <separator/>
                <filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
                <filter string="New or Offer Accepted" name="new_offer_accepted" domain="[('state', 'in', ['new', 'offer_accepted'])]"/>
                <group expand="1" string="Group By">
                    <filter string="邮编分组" name="postcode" context="{'group_by':'postcode'}"/>
                </group>
            </search>
        </field>
    </record>

 最终实现如下的搜索功能:

 

看起来不错吧?至此,我们已经能够创建模型,并设计出具有业务意义的用户界面。然而,我们还缺少一个关键部分:模型之间的联系。

下期见!


上一篇 odoo17开发教程(9):自定义视图_构建仪表板 odoo-CSDN博客

下一篇 odoo17开发教程(11):模型之间的关系-多对一-CSDN博客

  • 29
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值