第 6 章:基本视图
我们在上一章中已经看到Odoo能够为给定模型生成默认视图。在实践中,默认视图对于业务应用程序是绝对不可接受的。相反,我们至少应该以合理的方式组织各个字段。
视图是在 XML 文件中定义的,其中包含操作和菜单。它们是ir.ui.view模型的实例。
在我们的 real estate 模块中,我们需要以合理的方式组织字段:
在 List 视图中,我们想要显示的不仅仅是Name。
在Form(表单)视图中,应对字段进行分组。
在Search(搜索)视图中,我们必须能够搜索多个名称。具体来说,我们需要一个 'Available' 属性的过滤器和按postcode分组的快捷方式。
列表视图(也称为树形视图)以表格形式显示记录。
它们的根元素是<list>。这个视图的最基本版本就是列出要在表中显示的所有字段(其中每个字段都是一列):
<list string="Tests">
<field name="name"/>
<field name="last_seen"/>
</list>
我们现在的列表页,只显示了name一个值。
我们将实现在列表中显示多个字段的数据:
<?xml version="1.0"?>
<odoo>
<record id="estate_property_action" model="ir.actions.act_window">
<field name="name">房屋</field>
<field name="res_model">estate_property</field>
<field name="view_mode">tree,form</field>
</record>
<record id="estate_property_view_tree" model="ir.ui.view">
<field name="name">房屋列表</field>
<field name="model">estate_property</field>
<field name="arch" type="xml">
<tree string="tree_test">
<field name="name"/>
<field name="bedrooms"/>
<field name="living_area"/>
<field name="expected_price"/>
<field name="selling_price"/>
<field name="date_available"/>
</tree>
</field>
</record>
</odoo>
表单用于创建和编辑单个记录。
它们的根元素是<form>。它们由高级结构元素(groups和notebooks)和交互式元素(按钮和字段)组成:
<form string="Test">
<sheet>
<group>
<group>
<field name="name"/>
</group>
<group>
<field name="last_seen"/>
</group>
</group>
<notebook>
<page string="Description">
<field name="description"/>
</page>
</notebook>
</sheet>
</form>
通过对照下面的图片,就知道group和notebook的区别:
也可以使用div和h1等常规HTML标记以及类属性(Odoo提供了一些内置类)对外观进行微调。
接下来为我们的模块添加自定义表单视图。
修改views/estate_property_views.xml文件为:
<?xml version="1.0"?>
<odoo>
<record id="estate_property_action" model="ir.actions.act_window">
<field name="name">房屋</field>
<field name="res_model">estate_property</field>
<field name="view_mode">tree,form</field>
</record>
<record id="estate_property_view_tree" model="ir.ui.view">
<field name="name">房屋列表</field>
<field name="model">estate_property</field>
<field name="arch" type="xml">
<tree string="哈哈哈">
<field name="name"/>
<field name="bedrooms"/>
<field name="living_area"/>
<field name="expected_price"/>
<field name="selling_price"/>
<field name="date_available"/>
</tree>
</field>
</record>
<record id="estate_property_view_form" model="ir.ui.view">
<field name="name">房屋详情</field>
<field name="model">estate_property</field>
<field name="arch" type="xml">
<form string="详情">
<sheet>
<div class="oe_title">
<h1>
<field name="name"/>
</h1>
</div>
<group name="estate_property_header">
<group name="estate_property_details">
<group col="2">
<field name="postcode"/>
<field name="expected_price"/>
</group>
<group col="2">
<field name="date_available"/>
<field name="selling_price"/>
</group>
</group>
<notebook>
<page string="description">
<group name="estate_property_details">
<field name="description"/>
<field name="bedrooms"/>
<field name="living_area"/>
<field name="facades"/>
<field name="garage"/>
<field name="garden_area"/>
<field name="garden_orientation"/>
</group>
</page>
</notebook>
</group>
</sheet>
</form>
</field>
</record>
</odoo>
搜索视图与列表和表单视图略有不同,因为它们不显示内容。虽然它们适用于特定的模型,但它们用于过滤其他视图的内容(通常是聚合视图,如列表)。除了用例不同外,它们的定义方式是一样的。
它们的根元素是 <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中,domain是用来解析搜索条件的:域是用于选择模型记录子集的标准列表。每个标准都是一个三元组,包含一个字段名称、一个运算符和一个值。如果指定的字段满足应用于值的运算符的条件,则记录满足标准。
例如,在产品模型中使用以下域时,会选择单价大于 1000 的所有服务:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,标准与隐式AND结合,这意味着每条标准都必须满足,记录才能与域匹配。逻辑运算符&(AND)、|(OR)和!(NOT)可用于显式组合标准。它们在前缀位置使用(操作符插入在参数之前,而不是参数之间)。例如,选择 "服务或单价不在 1000 和 2000 之间 "的产品:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
接下来,为我们的模块添加filter和Group By。
应将以下内容添加到之前创建的搜索视图中:
一个显示可用属性的过滤器,即状态应为 'New' 或 ' offer_accepted '。
能够按邮政编码对结果进行分组。
在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>
第6章:基本视图