Edición de vistas con Python
En Odoo, la personalización de vistas es una de las formas más efectivas de adaptar el sistema a las necesidades específicas de cada negocio. En versiones recientes, dos funciones en particular, _get_view y _get_view_cache_key, se han convertido en herramientas clave para lograr ajustes dinámicos en tiempo de ejecución. Con ellas es posible modificar etiquetas, atributos o estructuras de las vistas utilizando Python de forma flexible y, al mismo tiempo, gestionar cómo se almacenan en caché para distintos contextos. En este blog exploraremos cómo aprovechar estas funciones para crear experiencias más adaptadas y eficientes en Odoo.
Daniel Sánchez
8/22/20255 min read


¿Cómo se pueden editar las vistas utilizando Python?
Se depende principalmente de las siguientes dos funciones:
_get_view
Reemplaza al antiguo método fields_view_get (utilizado hasta Odoo 15) y se desencadena cada vez que se carga una vista en el usuario (formulario, lista, kanban, etc.). Retorna una tupla (arch, view) donde:
● arch: es el XML analizado de la vista (un nodo etree que admite operaciones XPath).
● view: es el registro ir.ui.view asociado.
Esta función permite cambiar etiquetas (string) de campos dinámicamente, modificar atributos según condiciones (como empresa activa o grupos de usuario) o adaptar visualización sin duplicar vistas en XML.
_get_view_cache_key
Está vinculado al sistema de cacheado de vistas de Odoo. Permite construir una clave única para cada combinación de vista más contexto, de tal manera que diferentes usuarios o situaciones puedan tener vistas personalizadas sin que se reutilicen vistas de otros contextos.
Cuando se sobreescribe _get_view para personalizar vistas según contexto (por ejemplo, empresa o grupo), conviene redefinir _get_view_cache_key para que la caché considere esas condiciones adicionales.
Usos y ejemplos
El ejemplo más conocido en los módulos base de Odoo es en las monedas, donde existe una columna llamada “Unidad por X”, siendo X el nombre de la moneda de la compañía:


Si se cambiara el nombre de esa moneda, el nombre de esa columna no se podría cambiar dinámicamente utilizando las funcionalidades estándar de Odoo para la edición de vistas, por lo que utilizando las funciones anteriores se logra que esta columna tenga el nuevo nombre de la moneda. Por ejemplo, se modifica el nombre de la moneda de MXN a MX, y ese nuevo nombre se visualiza en la columna:




Ejemplo de edición de una vista utilizando Python
Supongamos que queremos editar dinámicamente la vista formulario de las cotizaciones dependiendo de si el usuario tiene o no el permiso “Ventas / Administrador”, mismo que está dentro del módulo de ventas.


Si el usuario tiene este permiso, podrá ver todos los botones del elemento <header> de la vista formulario; de lo contrario, no verá ningún botón ni el widget de estado. Dentro de una clase que herede a ‘sale.order’, el código se estructura de la siguiente manera:
_get_view_cache_key


donde:
●key es el resultado original de la función _get_view_cache_key.
●Al resultado de key le agregamos la condición de si el usuario tiene el permiso ‘sales_team.group_sale_manager’ (nombre técnico del permiso “Ventas / Administrador”). Así, si el usuario cambia el tener o no este permiso, la clave de la caché también cambia y fuerza que se regenere la vista según las condiciones que definimos en la siguiente función.
_get_view


donde:
●arch y view son los resultados originales de la función _get_view.
●Validamos si el tipo de vista es formulario (form), que es donde haremos los cambios, y si el usuario tiene o no el permiso de usuario. De ser que se cumplan las condiciones necesarias, modificamos la vista buscando el nodo utilizando XPath y, si encontramos el nodo, añadimos el parámetro invisible="1" (que sea invisible).
Por lo que, si no tenemos el permiso indicado, la vista se visualiza de la siguiente manera:


Al colocarnos el permiso de nuevo, se visualizan los botones y la barra de estado con normalidad.


Supongamos que únicamente quisiéramos ocultar el botón ‘Enviar por correo electrónico’, por lo que el código se modifica de la siguiente manera:


Por lo que, si no tuviésemos el permiso, la vista se visualizaría de la siguiente manera:


Aunque la modificación de vistas desde Python no es solo ocultar partes de la vista, sino agregar o quitar parámetros, nuevos nodos o el propio valor de los parámetros. Un ejemplo burdo es que, si el usuario tiene el permiso, el botón se visualiza y tiene un texto diferente.
Esto lo logramos reestructurando el código de la siguiente manera.


Por lo que si tenemos el permiso de usuario, la vista se ve de la siguiente manera:


Consejos rápidos:
● Usa _get_view para ajustes ligeros; por ejemplo, cambia etiquetas (string), atributos (readonly, invisible) o incluso añade nodos al XML sin necesidad de duplicar vistas.
●Localiza campos o secciones específicas de la vista con expresiones XPath para mantener tu código limpio y preciso.
●Reserva _get_view para cambios dinámicos que no pueden resolverse con herencias XML normales.
●Si tus cambios dependen de contexto (ej., compañía, grupos de usuario), redefine _get_view_cache_key para que cada situación tenga su propia versión en memoria.
●Añade solo los elementos relevantes al cache key (por ejemplo, company_id o user_has_groups) para evitar duplicaciones innecesarias.
●Asegúrate de que la personalización se aplica correctamente al cambiar de compañía, grupo o rol.
En Exdoo podemos desarrollar cualquier módulo para Odoo en México, implementamos tu ERP con consultores experimentados no solo en Odoo sino en procesos de negocios, tenemos 10 años trabajando solamente con Odoo en México y otros países
Exdoo TI S DE RL DE CV
10 años de experiencia en Odoo