第6章:基本视图

第 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章:基本视图
谢潮聪 2024年12月5日
分析这篇文章

存档
登录 留下评论
第5章:最后,一些UI可以玩