Odoo中如何在notebook form view内展示已有tree view
Odoo 表单Notebook区域内嵌已有Tree视图配置方法
按Model X和Model Y的关联关系选对应方案即可,全程不需要重复编写你已经开发完成的Model X Tree视图代码:
- 方案1:两个模型已经配置关联字段(绝大多数业务场景用这个)
只要你在Model Y上定义了指向Model X的One2many/Many2many字段,或是Model X上有指向Model Y的Many2one字段,直接在Notebook的page节点内引入关联字段,指定你已有Tree视图的XML ID即可完成复用:
这个配置会自动加载和当前Y记录关联的X数据,原有Tree视图上的按钮、字段、颜色规则、计算逻辑全部可以直接复用,不会丢失原有功能。<!-- 继承或重写Model Y的Form视图 --> <record id="inherit_model_y_form" model="ir.ui.view"> <field name="name">model.y.form.inherit</field> <field name="model">model.y</field> <field name="inherit_id" ref="原Model Y表单视图的XMLID"/> <field name="arch" type="xml"> <!-- 定位到你要插入Notebook的位置,从零写Y的表单时直接写全结构即可 --> <xpath expr="//sheet" position="after"> <notebook> <page string="关联X记录" name="x_related_page"> <!-- name填Model Y上关联X的字段名,views参数绑定你已经写好的X的Tree视图 --> <field name="x_record_ids"> <tree views="[(ref('你的模块名.model_x_exist_tree_view_id'), 'list')]"/> </field> </page> </notebook> </xpath> </field> </record> - 方案2:两个模型无直接关联,需要展示指定规则过滤后的Model X列表
不需要额外新建关联字段,直接在Notebook页面里绑定Model X的窗口动作,指定复用已有Tree视图即可:<record id="inherit_model_y_form" model="ir.ui.view"> <field name="name">model.y.form.inherit</field> <field name="model">model.y</field> <field name="inherit_id" ref="原Model Y表单视图的XMLID"/> <field name="arch" type="xml"> <xpath expr="//sheet" position="after"> <notebook> <page string="X记录列表" name="x_list_page"> <act_window name="X数据列表" res_model="model.x" src_model="model.y" view_mode="tree" multi="True" views="[(ref('你的模块名.model_x_exist_tree_view_id'), 'list')]" <!-- domain里写过滤规则,支持取当前Y表单的字段值做动态过滤 --> domain="[('state', '=', 'done')]" <!-- 如果要新建X记录时自动关联当前Y,在context里传对应字段默认值 --> context="{'default_y_related_id': active_id}" /> </page> </notebook> </xpath> </field> </record>
避坑提示:
- 绑定视图时XMLID必须加所属模块名前缀,比如你的Tree视图定义在
crm模块下,id是crm_lead_tree,那ref值必须写ref('crm.crm_lead_tree'),否则升级模块时会报视图不存在的错误- 不要在
<tree>标签内重复写字段列配置,否则会直接覆盖你原有Tree视图的定义,导致之前写的样式、逻辑失效- 如果需要同时在Tree下面支持点开记录看Form视图,只要在views参数里追加对应Form视图的引用即可,格式和Tree一致
内容的提问来源于stack exchange,提问作者Rama Alty
相关产品推荐
相关产品推荐

