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视图

搜索

筛选

分组

posted @ 2022-07-04 15:25  pure3417  阅读(432)  评论(0编辑  收藏  举报