Odoo(十):基本视图
在上一篇中我们Odoo我们可以发现,能够为给定模型生成默认视图。在实实际开发中,业务应用程序永远不会接受默认视图。相反,我们至少应该以一种合乎逻辑的方式组织各个领域。
视图在带有操作和菜单的 XML 文件中定义。它们是 ir.ui.view
模型的实例。
在我们的房地产模块中,我们需要以一种合乎逻辑的方式组织字段:
- 在列表(树)视图中,我们希望显示的不仅仅是名称。
- 在表单视图中,字段应该被分组。
- 在搜索视图中,我们必须能够搜索的不仅仅是名称。具体来说,我们需要一个“可用”属性的过滤器和一个按邮政编码分组的快捷方式。
常见的视图有如下几种:
- form视图
- tree视图
- kanban视图
- graph视图
- gatt视图
每种视图的结构不一样,下面我们将简单介绍一下Form、Tree、Search视图的使用方法.
列表(list/tree)视图
列表视图,也叫做树视图,以表格的格式显示记录
它的根元素是tree
。tree视图的最基本版本只是列出了要在表中显示的所有字段(其中每个字段都是一列)
例如
<record id="crm_lost_reason_view_tree" model="ir.ui.view">
<field name="name">crm.lost.reason.tree</field>
<field name="model">crm.lost.reason</field>
<field name="arch" type="xml">
<tree string="Channel" editable="bottom">
<field name="name"/>
</tree>
</field>
</record>
Form视图
表单用于创建和编辑单个记录。
它们的根元素是<form>
。它们由高级结构元素(组和笔记本)和交互元素(按钮和字段)组成。
例如
<record id="crm_lost_reason_view_form" model="ir.ui.view">
<field name="name">crm.lost.reason.form</field>
<field name="model">crm.lost.reason</field>
<field name="arch" type="xml">
<form string="Lost Reason">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="action_lost_leads" type="object"
class="oe_stat_button" icon="fa-star">
<div class="o_stat_info">
<field name="leads_count" class="o_stat_value"/>
<span class="o_stat_text"> Leads</span>
</div>
</button>
</div>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger" attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title">
<div class="oe_edit_only">
<label for="name"/>
</div>
<h1 class="mb32">
<field name="name" class="mb16"/>
</h1>
<field name="active" invisible="1"/>
</div>
</sheet>
</form>
</field>
</record>
Search视图
搜索视图与列表视图和表单视图略有不同,因为它们不显示 内容。虽然它们适用于特定模型,但它们用于过滤其他视图的内容(通常是聚合视图,例如List)。除了用例的差异之外,它们的定义方式相同。
它们的根元素是<search>
。此视图的最基本版本仅列出需要快捷方式的所有字段
Odoo 生成的默认搜索视图提供了一个快捷方式来过滤name
。在自定义搜索视图中添加用户可能过滤的字段是很常见的。
例如
<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>
搜索视图还可以包含<filter>
元素,这些元素充当预定义搜索的切换。过滤器必须具有以下属性之一:
domain
:将给定域添加到当前搜索context
:为当前搜索添加一些上下文;使用键group_by
对给定字段名称的结果进行分组
域
在 Odoo 中,域对记录的条件进行编码:域是用于选择模型记录子集的标准列表。每个标准都是一个三元组,包含一个字段名、一个运算符和一个值。如果指定字段满足应用于值的运算符的条件,则记录满足条件。
例如,当在Product模型上使用时,以下域选择单价大于1000的所有服务:
[('product_type', '=', 'service'), ('unit_price', '>', 1000)]
默认情况下,条件与隐式 AND 相结合,这意味着需要满足每个条件才能使记录与域匹配。逻辑运算符 &
(AND)、|
(OR) 和!
(NOT) 可用于显式组合条件。它们用于前缀位置(运算符插入在其参数之前而不是介于两者之间)。
例如,要选择“属于服务或单价不在1000 到 2000 之间”的产品:
['|',
('product_type', '=', 'service'),
'!', '&',
('unit_price', '>=', 1000),
('unit_price', '<', 2000)]
代码
代码
addons_my\estate\views\estate_property_view.xml
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<data>
<!--tree 视图-->
<record id="estate_property_tree_view" model="ir.ui.view">
<field name="name">房产广告</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<tree>
<field name="name" string="name"/>
<field name="bedrooms" string="bedrooms"/>
<field name="postcode" string="postcode"/>
<field name="living_area" string="living area"/>
<field name="expected_price" string="expected price"/>
<field name="date_availability" string="available from"/>
</tree>
</field>
</record>
<!--form 视图-->
<record id="estate_property_form_view" model="ir.ui.view">
<field name="name">房产广告</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<form>
<sheet>
<h1>
<field name="name" string="name"/>
</h1>
<group>
<group>
<field name="postcode" string="postcode"/>
<field name="date_availability" string="available from"/>
</group>
<group>
<field name="expected_price" string="expected price"/>
<field name="selling_price" string="selling price"/>
</group>
</group>
<notebook>
<page string="Description">
<group>
<field name="description" string="description"/>
<field name="bedrooms" string="bedrooms"/>
<field name="living_area" string="living area"/>
<field name="facades" string="facades"/>
<field name="garage" string="garage"/>
<field name="garden" string="garden"/>
<field name="garden_area" string="garden_area"/>
</group>
</page>
</notebook>
</sheet>
</form>
</field>
</record>
<!--search 视图-->
<record id="estate_property_search_view" model="ir.ui.view">
<field name="name">房地产广告</field>
<field name="model">estate.property</field>
<field name="arch" type="xml">
<search>
<field name="name" string="标题"/>
<field name="postcode" string="邮编"/>
<field name="expected_price" string="预期价格"/>
<field name="bedrooms" string="卧室"/>
<field name="living_area" string="居住面积"/>
<field name="facades" string="外立面"/>
<filter name="" string="卧室大于3" domain="[('bedrooms','>','3')]"/>
<filter name="" string="卧室大于3,居住面积大于200" domain="[('bedrooms','>',3),('living_area','>',200)]"/>
<group string="group by">
<field name="balcony_orientation" string="阳台方向" context="{'group_by':'balcony_orientation'}"/>
</group>
</search>
</field>
</record>
<record id="estate_property_action_window" model="ir.actions.act_window">
<field name="name">房地产广告</field>
<field name="res_model">estate.property</field>
<field name="view_mode">tree,form,search</field>
</record>
<menuitem id="estate_property_menu_action"
action="estate_property_action_window"/>
</data>
</odoo>
效果
tree视图
form视图
search视图
搜索
筛选
分组