You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Odoo 17树形视图如何根据字段动态显示/隐藏列

Odoo 17 树形视图动态显示字段解决方案

核心问题分析

你混淆了column_invisibleinvisible的作用:

  • 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

火山引擎 最新活动