Muchas veces necesitamos mostrar (u ocultar) un campo en un formulario basados en una condición lógica. Un ejemplo de eso es lo que hacemos en el módulo purchase_indirect_costs, donde mostramos el tipo de cambio de la orden de compra. La idea es, mostrar el campo de tipo de cambio (llamado exchange_rate) siempre y cuando la moneda sea igual a la moneda de la compañía (el módulo calcula los costos directos e indirectos en USD, no en la moneda local).
Para ello primero en el modelo purchase.order agregamos dos campos. El primero es el del tipo de cambio, llamado exchange_rate. El segundo es un campo calculado llamado show_exchange_rate que nos sirve para saber si debemos mostrar el campo exchange_rate o no. La definición de ambos campos es la siguiente:
exchange_rate = fields.Float('Tipo de cambio')
show_exchange_rate = fields.Boolean('show_exchange_rate',compute='_compute_exchange_rate')
def _compute_exchange_rate(self):
for rec in self:
res = True
if rec.currency_id.id != rec.company_id.currency_id.id:
res = False
rec.show_exchange_rate = res
Y en el método _compute_exchange_rate ahi actualizamos el campo computado indicando un valor falso si la moneda es diferente a la moneda de la empresa. Caso contrario el valor del campo es verdadero.
Ahora, en la vista de la orden de compras vamos a mostrar el campo exchange_rate después de la moneda de la orden de compras. También agregamos el campo show_exchange_rate pero no lo mostramos (gracias al atributo invisible), y luego agregamos el atributo invisible al campo exchange_rate, pero lo hacemos condicional al valor del campo show_exchange_rate. Lo hacemos de la siguiente forma:
<field name="currency_id" position="after">
<field name="show_exchange_rate" invisible="1" />
<field name="exchange_rate" attrs="{'invisible': [('show_exchange_rate','=',False)]}" />
</field>
Como pueden ver, se setea el atributo invisible si el campo show_exchange_rate es Falso (lo que oculta el campo de tipo de cambio). Caso contrario (si la orden de compra es en moneda local) el valor del campo show_exchange_rate es True por ende se setea el atributo invisible a False (mostrando el campo). Este truco nos permitirá mostrar o no un campo basados en el valor de otro campo (u condición en el sistema).