Skip to Content

Odoo 动态显示或者隐藏字段实例详解

在 Odoo 中,form 视图根据条件显示或隐藏字段的方法

1. 使用 `domain` 属性

`domain` 属性可控制字段的可见性。例如,仅在某个条件满足时显示某个字段。

<field name="boyfriend_name" attrs="{'invisible': [('is_married', '=', False)]}"/>

此例中,`boyfriend_name` 字段仅在 `is_married` 字段为 `True` 时可见。

2. 使用 `states` 属性

`states` 属性可依据对象的 `state` 字段控制字段的可见性。例如:

<field name="customer_contact" attrs="{'invisible': [('state', '!=', 'draft')]}"/>

此例中,`customer_contact` 字段仅在 `state` 字段为 `draft` 时可见。

3. 动态视图(重写 `fields_view_get` 方法)

若需更复杂的条件判断,可重写 `fields_view_get` 方法动态修改视图结构。

from lxml import etree

def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False):
    if context is None:
        context = {}
    res = super(YourModel, self).fields_view_get(cr, uid, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu)
    if res['type'] == 'form':
        doc = etree.XML(res['arch'])
        # 根据条件判断是否显示字段
        if not self.is_creator(cr, uid, context=context):
            # 隐藏字段
            for node in doc.xpath("//field[@name='customer_contact']"):
                node.set('invisible', '1')
        res['arch'] = etree.tostring(doc)
    return res

def is_creator(self, cr, uid, context=None):
    # 判断当前用户是否是创建人
    return uid == context.get('uid')

此例中,`fields_view_get` 方法被重写,依据当前用户是否为创建人决定是否显示 `customer_contact` 字段。

4. 使用 `groups` 属性

若字段的显示与用户组相关,可使用 `groups` 属性。

<field name="sensitive_info" groups="your_module.group_name"/>

此例中,`sensitive_info` 字段仅在用户属于 `group_name` 组时可见。

5. 使用 `attrs` 属性结合 `context`

`attrs` 属性可结合 `context` 动态控制字段的可见性。

<field name="field_name" attrs="{'invisible': [('context.get('condition', False)', '=', True)]}"/>

此例中,`field_name` 字段的可见性由 `context` 中的 `condition` 值决定。

总结

  • 简单条件:使用 `domain` 或 `states` 属性。
  • 复杂条件:重写 `fields_view_get` 方法。
  • 用户组相关:使用 `groups` 属性。
  • 动态条件:结合 `context` 使用 `attrs` 属性。

可根据具体需求选择合适的方法实现字段的条件显示。

Odoo 动态显示或者隐藏字段实例详解
6776, Administrator September 29, 2024
Tags
Archive