Odoo field has an attribute called ‘attrs’. This adds custom attribute to the Odoo form/tree views. You may use different kind of attributes with attrs like ‘required’, ‘readonly’ or ‘invisible’. For basic, to hide a field regardless of it be an individual entity or parent relation, we use the following:
<field name='field_name' invisible='1'/>
This is useful when we are triggering a computed field that we don’t want to show on a tree/form view. But what if we want to dynamically decide whether to invisible the field or not? For such cases, we usually use invisible with the ‘attrs’ attribute on fields, for example:
<field name='product_id' attrs="{ 'invisible': [('is_set', '=', True)]}"/>
You might set the field 'is_set'
itself as invisible and a boolean computed field like the following:
is_set = fields.Boolean(compute="_set_is_set")
def _set_is_set(self):
if self.lot_id.life_date:
self.is_set = True
else:
self.is_set = False
Seems easy, right? But there is a catch, the above won’t hide the whole column if you are on a place like ‘purchase.order.line’ or ‘stock.move.line’. How can you work on such cases? It only works on individual entry, but not on a relational column. There is an attribute called ‘column_invisible’ same like ‘invisible’ we have used above. But the difference is, you need to set this based on parent value, thus hides a relational column. Here is an example to hide a column called ‘show_expiry’ in a picking operation:
<field name="show_expiry" attrs="{ 'column_invisible' : [('parent.picking_type_code', 'in', ['incoming'])]}" />
Above code checks the ‘picking_type_code’ value from ‘stock.picking’ model, and hides the column if it’s an incoming shipment and shows when it’s an outgoing shipment. That means, the above, would show the column (show_expiry) if it’s a Delivery to customer location or you already have the product, but won’t show if you are doing a GRN, means you don’t have the stock yet, just arriving.
Pretty simple, isn’t it? Good luck.
Column_invisible is working but when I try to click again the boolean field, it returns an error Cannot read property ‘split’ of undefined
You are using the python ‘split’ plugin in an field that is expected to be iterable, but actually getting ‘False’. Without looking at the whole code, I am afraid, not sure where specific to point!
i also get this error column_invisible use only if you want to hide field correspond with parent field.
we can’t directly hide field from current object of list view.
Excellent post