Saltar al contenido

Herencia primaria de vistas

🐍 DESARROLLO · ODOO · VISTAS XML

Herencia primaria de vistas en Odoo

La herencia primaria (mode="primary") es el mecanismo que permite crear una vista independiente a partir de otra en Odoo, sin modificar la vista original. Es clave para la modularidad: distintos módulos pueden tener su propia vista derivada sin pisarse entre sí.

🔀
VISTA INDEPENDIENTE
Hereda pero no modifica la original

🧩
MODULAR
Sin colisiones entre módulos

🔗
REQUIERE ACCIÓN
Hay que mostrarla con su propio menú

⬇️
HERENCIA UNIDIRECCIONAL
Recibe cambios de la original, no al revés

1
¿Qué es la herencia primaria?

En Odoo, la herencia primaria de vistas (primary view inheritance) es el mecanismo mediante el cual una vista base es extendida o modificada por otras vistas sin reemplazarla completamente. Es fundamental para la modularidad: distintos módulos pueden alterar la interfaz sin entrar en conflicto entre sí.

Una vista primaria es la vista original definida para un modelo y un tipo específico:

form
tree / list
kanban
search
graph / pivot…

Una herencia primaria es una vista que hereda de alguna de estas vistas originales pero usando mode="primary" en lugar del modo por defecto.

Definición de herencia primaria con mode primary en XML

2
Diferencia clave: primary vs extension

Esta es la distinción que define todo el comportamiento:

mode=”primary”
NO modifica la vista original. Crea una vista independiente que hereda los campos y cambios de la original más los suyos propios.
Resultado: los cambios solo aparecen al abrir esta vista vía su propia acción/menú.

mode=”extension” (default)
Modifica la vista original directamente. Los cambios se ven en todos los lugares donde se use esa vista.
Resultado: los cambios aparecen en la vista original sin necesidad de un menú nuevo.

💡 PUNTO CLAVE
El campo mode solo aplica si estás heredando de otra vista vía inherit_id. Si no hay inherit_id, estás creando una vista raíz, no una herencia.

3
Caso práctico: heredar la vista de Compras

Tomamos como base la vista lista de las compras (modelo purchase.order), cuyo nombre técnico es purchase.purchase_order_kpis_tree.

Vista lista original de Solicitudes de cotización

Creamos una nueva vista con herencia primaria en un módulo personalizado. En esta nueva vista agregamos la columna Moneda después de la columna Estado:

Código XML de la vista heredada con mode primary, agregando columna Moneda

Como la vista primaria es independiente, también necesitamos definir una acción y un elemento de menú para mostrarla. Aquí el menú se llama “Nueva vista Solicitudes de cotización” y aparece después del menú original:

Código XML de la acción y el menú que invocan a la vista primaria

Al actualizar el módulo, vemos el nuevo elemento de menú; al seleccionarlo, encontramos la columna Moneda después de Estado:

Nuevo menú visible tras actualizar el módulo
Vista primaria mostrando la columna Moneda añadida

4
Verificación: la vista original NO se modifica

Aquí está la prueba clave del comportamiento de mode="primary": si volvemos a la vista original de Solicitudes de cotización, la columna Moneda que agregamos no aparece ahí.

Vista original sin la columna Moneda — los cambios no se propagan hacia arriba
📌 ¿POR QUÉ?
La vista creada con herencia primaria toma los campos y cambios de la vista a la que hereda, pero los cambios que agregues en esta nueva vista no se reflejan en la vista original. La herencia es unidireccional: original → primary, nunca al revés.

5
Lo inverso: extension SÍ se propaga (incluso a la primary)

Para confirmar, hacemos el experimento inverso: creamos una vista que herede de la original sin usar herencia primaria (modo extension por defecto). Agregamos la columna Fecha de confirmación después de Fecha límite de la orden:

Código XML de una herencia normal con mode extension

Como esperamos, la nueva columna se ve en la vista original. Pero lo interesante: también aparece en la vista primaria que creamos antes, junto con la columna Moneda:

Vista primaria mostrando ambas columnas: Moneda y Fecha de confirmación
✅ HERENCIA HACIA ABAJO
La vista con herencia primaria también obtiene los cambios y modificaciones que se hagan sobre la vista original. Es una herencia “viva”: cambios en la base bajan a las primary, pero los cambios en la primary no suben a la base.

6
Cascada: heredar de una vista primaria

Por último, podemos crear una nueva vista que herede de la propia vista primaria (la “Nueva vista Solicitudes de cotización”). Agregamos la columna Entrega esperada después de Fecha de confirmación:

Código XML heredando de la vista primaria

Al actualizar el módulo y abrir la vista primaria, vemos las tres columnas (Moneda, Fecha de confirmación y Entrega esperada):

Vista primaria con la nueva columna Entrega esperada agregada en cascada

Pero al volver a la vista original de Solicitudes de cotización, la columna Entrega esperada no está — confirma que la herencia primaria aísla por completo los cambios:

Vista original sin la columna Entrega esperada — el aislamiento es total

📊 Cómo se propagan los cambios

Escenario A — extension sobre la original:
Vista original    cambio visible
Vista primary      cambio visible (heredado)
Escenario B — extension sobre la primary:
Vista original    cambio NO visible
Vista primary      cambio visible
Escenario C — primary sobre la original:
Vista original    cambio NO visible
Vista primary      cambio visible

💡 Consejos rápidos

🎯 Solo en casos específicos
Una vista primaria puede arrastrar campos que no estaban pensados para esa visualización. Úsala cuando necesites una variante coexistiendo con la original, no como atajo.

🔗 Requiere acción + menú propios
Si no defines una ir.actions.act_window que la apunte y un menú que la invoque, la vista primaria simplemente no se ve. No basta con definirla.

⚠️ Cuidado con el aislamiento
Recuerda que los cambios sobre la vista original llegan a la primary, pero los cambios sobre la primary no llegan a la original. Documenta bien para que no haya sorpresas.

📌 En resumen

La herencia primaria en Odoo es la herramienta correcta cuando necesitas una variante de una vista que coexista con la original sin alterarla. Define mode="primary", agrega los cambios deseados y exponla con su propia acción y menú.

La regla mental simple: la herencia siempre fluye hacia abajo, nunca hacia arriba. Para extensiones globales, usa mode="extension"; para variantes localizadas, mode="primary". En Exdoo desarrollamos módulos a medida en Odoo y compartimos contenido técnico para ayudar a otros developers.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

¿Te gustaría implementar Odoo en tu empresa?

12 años de experiencia · +60 implementaciones exitosas · Partner Gold de Odoo en México

Hablemos por WhatsApp