在 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` 属性。
可根据具体需求选择合适的方法实现字段的条件显示。