Como mostrar u ocultar un campo en un formulario basado en la condición de un campo

28 de junio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

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).


Gustavo Orrillo 28 de junio de 2023
Compartir
Archivar
Identificarse dejar un comentario