Skip to main content

VISTAS

Las vistas en Odoo definen cómo se muestran los datos de los modelos en la interfaz del usuario.
Se escriben en XML y se cargan dentro de un archivo del módulo, normalmente en la carpeta views/.


1. Tipos de vistas principales

Odoo soporta varios tipos de vistas. Las más comunes son:

TipoDescripción
FormMuestra un registro individual (vista detallada).
List (Tree)Muestra una lista de registros (tabla).
KanbanMuestra los registros en formato de tarjetas.
CalendarVisualiza los registros en un calendario.
GraphPermite mostrar datos de manera estadística (gráficos).
PivotPermite crear tablas dinámicas.

2. Estructura general de una vista XML

Todas las vistas se definen dentro de etiquetas <record> y <field name="arch" type="xml">.

<odoo>
<data>
<record id="view_modelo_form" model="ir.ui.view">
<field name="name">erciapps.modelo.form</field>
<field name="model">erciapps.modelo</field>
<field name="arch" type="xml">
<form string="Mi Modelo">
<sheet>
<group>
<field name="campo1"/>
<field name="campo2"/>
</group>
</sheet>
</form>
</field>
</record>
</data>
</odoo>

Campos importantes:

CampoDescripción
idIdentificador único de la vista dentro del módulo.
modelModelo de Odoo al que pertenece la vista.
nameNombre técnico de la vista.
archEstructura XML que define el diseño visual.

3. Ejemplo completo de vistas

A continuación se muestran ejemplos reales del módulo erciapps, con tres modelos: Departamento, Empleado y Proyecto.


Vista de Departamentos

Vista tipo lista (list)

<record id="view_departamento_list" model="ir.ui.view">
<field name="name">erciapps.departamento.list</field>
<field name="model">erciapps.departamento</field>
<field name="arch" type="xml">
<list string="Departamentos">
<field name="nombreDpto"/>
</list>
</field>
</record>

Vista tipo formulario (form)

<record id="view_departamento_form" model="ir.ui.view">
<field name="name">erciapps.departamento.form</field>
<field name="model">erciapps.departamento</field>
<field name="arch" type="xml">
<form string="Departamento">
<sheet>
<group>
<field name="nombreDpto"/>
</group>
<notebook>
<page string="Empleados">
<field name="empleado_ids"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>

Notas: - El notebook permite incluir pestañas dentro de la vista. - El campo empleado_ids es un One2many, y se muestra automáticamente como tabla editable.


Vista de Empleados

Vista tipo lista

<record id="view_empleado_list" model="ir.ui.view">
<field name="name">erciapps.empleado.list</field>
<field name="model">erciapps.empleado</field>
<field name="arch" type="xml">
<list string="Empleados">
<field name="dniEmpleado"/>
<field name="nombreEmpleado"/>
<field name="departamento_id"/>
</list>
</field>
</record>

Vista tipo formulario

<record id="view_empleado_form" model="ir.ui.view">
<field name="name">erciapps.empleado.form</field>
<field name="model">erciapps.empleado</field>
<field name="arch" type="xml">
<form string="Empleado">
<sheet>
<group>
<field name="dniEmpleado"/>
<field name="nombreEmpleado"/>
<field name="fechaNacimiento"/>
<field name="direccionEmpleado"/>
<field name="departamento_id"/>
</group>
<notebook>
<page string="Proyectos">
<field name="proyecto_ids" widget="many2many_tags"/>
</page>
</notebook>
</sheet>
</form>
</field>
</record>

Notas: - El widget many2many_tags muestra las relaciones Many2many como etiquetas visuales. - departamento_id es un Many2one, mostrado como selector desplegable.


Vista de Proyectos

Vista tipo lista

<record id="view_proyecto_list" model="ir.ui.view">
<field name="name">erciapps.proyecto.list</field>
<field name="model">erciapps.proyecto</field>
<field name="arch" type="xml">
<list string="Proyectos">
<field name="nombreProyecto"/>
<field name="tipoProyecto"/>
</list>
</field>
</record>

Vista tipo formulario

<record id="view_proyecto_form" model="ir.ui.view">
<field name="name">erciapps.proyecto.form</field>
<field name="model">erciapps.proyecto</field>
<field name="arch" type="xml">
<form string="Proyecto">
<sheet>
<group>
<field name="nombreProyecto"/>
<field name="tipoProyecto"/>
<field name="descripcionProyecto"/>
<field name="empleado_ids" widget="many2many_tags"/>
</group>
</sheet>
</form>
</field>
</record>

Notas: - tipoProyecto es un campo Selection, que se muestra como lista desplegable. - empleado_ids es un Many2many, mostrado también como etiquetas.


4. Acciones (ir.actions.act_window)

Las acciones son los elementos que abren las vistas desde los menús.
Cada acción define el modelo y los tipos de vista (list, form, etc.) que se mostrarán.

<record id="action_empleado" model="ir.actions.act_window">
<field name="name">Empleados</field>
<field name="res_model">erciapps.empleado</field>
<field name="view_mode">list,form</field>
</record>

5. Menús (menuitem)

Los menús permiten acceder a las acciones desde la interfaz principal de Odoo.

<!-- Menú raíz -->
<menuitem id="menu_erciapps_root" name="Gestión de Empresa"/>

<!-- Submenús -->
<menuitem id="menu_erciapps_departamentos" name="Departamentos"
parent="menu_erciapps_root" action="action_departamento"/>

<menuitem id="menu_erciapps_empleados" name="Empleados"
parent="menu_erciapps_root" action="action_empleado"/>

<menuitem id="menu_erciapps_proyectos" name="Proyectos"
parent="menu_erciapps_root" action="action_proyecto"/>

Notas: - Los menús pueden anidarse con el atributo parent. - El atributo action indica qué acción (vista) se abrirá.


6. Flujo de funcionamiento

Menú → Acción → Vista → Modelo → Base de datos

Cuando el usuario hace clic en un menú: 1. Odoo ejecuta la acción asociada.
2. La acción abre una o más vistas (list, form, etc.).
3. Las vistas muestran los datos del modelo asociado.
4. El modelo se comunica con la base de datos mediante el ORM.


7. Buenas prácticas

Usa nombres coherentes para vistas y acciones (modulo.modelo.tipo).
Coloca todas las vistas del módulo en views/ y define su orden en el __manifest__.py.
Utiliza notebook para separar información compleja.
Define una vista tipo lista y una tipo formulario para cada modelo principal.
Usa widgets (many2many_tags, image, url, boolean_toggle, etc.) para mejorar la interfaz.


8. Elementos de maquetación en vistas XML

Dentro de las vistas tipo formulario (<form>), Odoo permite organizar los campos visualmente usando varios contenedores y estructuras.
Estos elementos no afectan al modelo ni a la base de datos, solo al diseño visual.


8.1. <sheet>

Es el contenedor principal de la vista de formulario.
Dentro de él se incluye la estructura visual: grupos, pestañas, títulos, botones, etc.

<sheet>
...
</sheet>

El <sheet> aplica automáticamente márgenes, fondo y diseño coherente con el tema de Odoo.


8.2. <group>

Sirve para agrupar campos o secciones dentro del formulario.
Puede anidarse y también dividir el espacio en columnas.

<group>
<field name="dniEmpleado"/>
<field name="nombreEmpleado"/>
</group>

También puede recibir el atributo col="n" para indicar el número de columnas internas:

<group col="3">
<group>
<field name="dniEmpleado"/>
</group>
<group>
<field name="nombreEmpleado"/>
</group>
<group>
<field name="fechaNacimiento"/>
</group>
</group>

Explicación:

  • El grupo exterior define 3 columnas.
  • Cada subgrupo ocupa una columna y contiene los campos.

8.3. <notebook> y <page>

Permiten dividir la vista en pestañas (similar a un cuaderno con secciones).

<notebook>
<page string="Datos personales">
<field name="dniEmpleado"/>
<field name="nombreEmpleado"/>
</page>
<page string="Datos laborales">
<field name="departamento_id"/>
<field name="proyecto_ids"/>
</page>
</notebook>

Explicación:

  • <notebook> agrupa las pestañas.
  • Cada <page> define una pestaña con el atributo string (título mostrado).

8.4. <div> y clases CSS

Se pueden usar <div> con clases predefinidas para personalizar el diseño.

<div class="oe_button_box">
<!-- Contenedor de botones en la parte superior -->
</div>

Clases comunes:

  • oe_button_box: zona de botones al inicio del formulario.
  • oe_title: define una cabecera con título e imagen.
  • oe_chatter: activa la zona de mensajes y seguimiento de registros.

8.5. Botones dentro del formulario

Los botones se colocan dentro del <header> (parte superior) o dentro del <div class="oe_button_box">.

<header>
<button name="%(action_report_empleado)d"
string="Imprimir Ficha"
type="action"
class="oe_highlight"
icon="fa-print"/>
</header>

Explicación:

  • header: zona reservada para botones globales.
  • name: acción que ejecuta (por ejemplo, un informe o un método Python).
  • string: texto visible en el botón.
  • type: tipo de acción (action, object, etc.).
  • icon: icono opcional (Font Awesome).

8.6. Títulos y textos

Puedes usar etiquetas HTML estándar (<h1>, <h2>, <p>) dentro de la vista.

<group>
<h1>VISTA EMPLEADOS</h1>
</group>

Esto permite mostrar títulos o separar secciones de forma más clara.


8.7. Estilo en línea

Es posible aplicar estilos simples directamente en los campos o etiquetas:

<field name="dniEmpleado" style="width:70%"/>

Sin embargo, se recomienda usar clases CSS en lugar de estilos en línea para mantener un diseño limpio y coherente.


8.8. Elementos adicionales útiles

ElementoUso principal
<separator string="Título"/>Inserta una línea separadora con un texto descriptivo.
<label for="campo"/>Muestra una etiqueta personalizada vinculada a un campo.
<newline/>Inserta un salto de línea dentro de un grupo.
<field name="campo" invisible="1"/>Oculta un campo en la vista.

8.9. Ejemplo completo

<form string="Empleado">
<sheet>
<div class="oe_button_box">
<button name="%(action_report_empleado)d"
string="Imprimir"
type="action"
icon="fa-print"
class="oe_highlight"/>
</div>

<group>
<h1>VISTA EMPLEADOS</h1>
</group>

<notebook>
<page string="Datos personales">
<group col="3">
<group><field name="dniEmpleado"/></group>
<group><field name="nombreEmpleado"/></group>
<group><field name="fechaNacimiento"/></group>
</group>
</page>

<page string="Datos laborales">
<field name="departamento_id"/>
<field name="proyecto_ids" widget="many2many_tags"/>
</page>
</notebook>
</sheet>
</form>