目录
搜索视图的简介
搜索视图与列表和表单视图略有不同,因为它们不显示内容。虽然它们适用于特定的模型,但它们用于过滤其他视图的内容(通常是聚合视图,如列表)。除了用例不同外,它们的定义方式是一样的。
它们的根元素是 <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>
最终实现如下的搜索功能:
看起来不错吧?至此,我们已经能够创建模型,并设计出具有业务意义的用户界面。然而,我们还缺少一个关键部分:模型之间的联系。
下期见!