Odoo 17树形视图如何根据字段动态显示/隐藏列
Odoo 17 树形视图动态显示字段解决方案
核心问题分析
你混淆了column_invisible和invisible的作用:
column_invisible:控制整个列是否显示,属于全局设置,无法针对单行做条件判断invisible:控制单行字段值是否隐藏,可基于当前记录的字段做条件判断
之前的代码误用了column_invisible,导致无法实现每行根据transport字段动态显示对应值的需求。
解决方案1:按子记录自身transport值显示对应字段(推荐)
如果需求是每条子记录根据自身的transport值,显示flight_no或voyage_no的内容(列保留,仅隐藏不符合条件的单元格值),修改树形视图代码如下:
<tree> <field name="name" string="Carriage"/> <field name="arrival_datetime"/> <!-- 仅当transport为air时显示flight_no的值 --> <field name="flight_no" invisible="transport != 'air'"/> <!-- 仅当transport为ocean时显示voyage_no的值 --> <field name="voyage_no" invisible="transport != 'ocean'"/> <field name="transport"/> <field name="line_added" column_invisible="1"/> <button name="action_insert_line_service" type="object" string="Add to Service" icon="fa-plus-square-o"/> </tree>
解决方案2:按父记录transport值切换显示列
如果需求是根据父记录(shipment)的transport值,整个树形视图统一显示flight_no或voyage_no列,需要分两步配置:
步骤1:传递父记录transport到子记录上下文
修改父表单中one2many字段的context,添加父记录的transport值:
<field name="freight_routes" nolabel="1" widget="one2many_list" context="{'shipper_id':shipper_id, 'consignee_id':consignee_id, 'parent_transport': transport}">
步骤2:在树形视图中基于上下文控制列显示
<tree> <field name="name" string="Carriage"/> <field name="arrival_datetime"/> <!-- 父记录transport为air时显示flight_no列 --> <field name="flight_no" column_invisible="context.get('parent_transport') != 'air'"/> <!-- 父记录transport为ocean时显示voyage_no列 --> <field name="voyage_no" column_invisible="context.get('parent_transport') != 'ocean'"/> <field name="transport"/> <field name="line_added" column_invisible="1"/> <button name="action_insert_line_service" type="object" string="Add to Service" icon="fa-plus-square-o"/> </tree>
注意:父记录transport值变化后,需要手动刷新one2many区域才能生效,若需自动刷新,可通过添加字段on_change事件或自定义JS实现。
内容的提问来源于stack exchange,提问作者Sheenergizer




