Introducción
En Odoo, los modelos definen la estructura y el almacenamiento de la información en la base de datos. Cualquier dato empresarial con el que trabajes se guarda en una instancia de modelo.
Comprender los modelos de Odoo es imprescindible tanto para desarrolladores como para consultores funcionales. Son la base sobre la que se sustentan las relaciones, los campos y la lógica de negocio en la plataforma.
Este texto se centra en el modelo website.page. Es el responsable de las páginas estáticas del sitio web en Odoo. Si construyes páginas de aterrizaje, gestionas contenido o integras con terceros, acabarás interactuando con este modelo.
¿Qué es el modelo website.page?
El modelo website.page representa las páginas estáticas del sitio en Odoo. Forma parte de la aplicación Website y almacena las páginas que creas manualmente, como Quiénes somos, Contacto o landings personalizadas.
En Odoo, website.page aprovecha la herencia de modelos. Mediante el mecanismo _inherits enlaza con ir.ui.view: cada registro de website.page referencia una vista que contiene la plantilla QWeb (arch) y metadatos.
Las páginas dinámicas, por ejemplo las listados de tienda o del blog, se generan mediante otros mecanismos.
Esas páginas dinámicas no se guardan como website.page. El modelo website.page está pensado exclusivamente para contenido estático creado y editado con el editor web.
Campos clave del modelo
A continuación tienes los campos más relevantes del modelo website.page. Conocerlos te permitirá manejar las páginas web con mayor eficacia.
1. name
Tipo: Char. Guarda el título de la página. Aparece en la pestaña del navegador, en menús y resultados de búsqueda. Se obtiene desde la ir.ui.view vinculada.
2. url
Tipo: Char. Ruta de acceso de la página. Debe comenzar por una barra (/). Ejemplos: /contacto, /quienes-somos. Es la dirección que usan los visitantes.
3. view_id
Tipo: Many2one (ir.ui.view). Obligatorio. Enlaza con la vista QWeb que contiene el contenido: la plantilla XML (arch) y la clave. Si se borra la vista, la página se elimina en cascada.
4. website_id
Tipo: Many2one (website). Indica a qué sitio pertenece la página. En instalaciones multiweb, las páginas pueden pertenecer a un sitio concreto o compartirse si el campo está vacío.
5. is_published
Tipo: Boolean. Indica si la página es visible públicamente. Las páginas no publicadas devuelven 404 o redirigen; sirve para ocultar contenido sin eliminarlo.
6. website_indexed
Tipo: Boolean. Controla si los motores de búsqueda indexan la página. Ponlo en False para páginas de agradecimiento o internas que no deben aparecer en resultados.
7. date_publish
Tipo: Datetime. Fecha de publicación. Se usa para publicar contenido de forma programada y para mostrar cuándo estuvo activo el contenido.
8. header_visible
Tipo: Boolean. Determina si el encabezado del sitio se muestra en la página. Útil en landings o experiencias a pantalla completa donde se quiera ocultar la cabecera.
9. footer_visible
Tipo: Boolean. Determina si se muestra el pie de página. Al igual que header_visible, permite crear páginas sin el pie habitual.
10. is_homepage
Tipo: Boolean. Campo calculado. True cuando la página está marcada como página principal del sitio. Sólo una página por website puede ser la homepage.
11. is_visible
Tipo: Boolean. Campo calculado. Indica si la página es visible según su estado de publicación, fecha y reglas de visibilidad.
12. menu_ids
Tipo: One2many (website.menu). Elementos de menú que enlazan a la página. Una página puede aparecer en varios menús o en ninguno.
13. create_date
Tipo: Datetime. Fecha de creación del registro. Gestionada automáticamente por Odoo; útil para auditoría e informes.
14. write_date
Tipo: Datetime. Fecha de la última modificación. También gestionada automáticamente; ayuda a rastrear cambios en el contenido.
15. arch
Tipo: Text. Plantilla QWeb en XML. Almacenada en la ir.ui.view vinculada; contiene la estructura HTML y los snippets de Odoo. Editable desde el constructor web.
16. key
Tipo: Char. Identificador único de la vista. Se emplea en XML de módulos y para herencia. Suele tener formato módulo.nombre_vista.
17. type
Tipo: Selection. Tipo de vista. Para páginas web siempre es qweb. Otros tipos son form, list o tree.
18. active
Tipo: Boolean. Bandera de eliminación suave. Si es False, el registro está archivado. Proviene de ir.ui.view; las páginas archivadas no se sirven.
19. website_meta_title
Tipo: Char. Meta título para SEO. Sobrescribe el título por defecto en resultados de búsqueda; clave para la visibilidad orgánica.
20. website_meta_description
Tipo: Text. Meta descripción SEO. El fragmento que muestra el buscador. Manténlo entre 150 y 160 caracteres para una visualización óptima.
21. website_meta_keywords
Tipo: Char. Palabras clave meta. Menos relevantes hoy para SEO pero aún usadas por ciertos sistemas. Separadas por comas.
22. header_overlay
Tipo: Boolean. Indica si el encabezado se superpone al contenido. Se usa en páginas con hero donde la cabecera queda encima del banner.
23. header_color
Tipo: Selection. Esquema de color del encabezado. Opciones como transparente, claro u oscuro. Afecta al contraste y la legibilidad.
24. visibility
Tipo: Selection. Control de acceso. Opciones: Público, Usuarios registrados, Grupo restringido o Con contraseña. Define quién puede ver la página.
25. redirect_type
Tipo: Selection. Define la redirección al cambiar la URL: 301 permanente, 302 temporal o ninguna. Importante para conservar SEO al mover contenido.
Cómo se utiliza este modelo en los procesos de negocio
1. Landing pages y campañas
Los equipos de marketing crean landings para campañas. Cada landing es un registro website.page: controlan la URL, el contenido y la fecha de publicación. date_publish permite programar la puesta en vivo.
2. Páginas corporativas
Páginas como Quiénes somos, Contacto, Condiciones y Política de privacidad suelen ser registros website.page. Se crean una vez y se actualizan cuando hace falta; su ubicación en el menú se gestiona con menu_ids.
3. Páginas de agradecimiento y confirmación
Páginas del tipo "Formulario enviado" o "Pedido recibido" son website.page. Conviene poner website_indexed en False para que no aparezcan en resultados de búsqueda.
4. Multiweb y localización
En entornos con varios sitios, website_id determina en cuál se muestra la página. Puedes duplicar páginas para cada sitio cuando necesites contenidos localizados.
5. Contenido restringido y acceso por grupos
El campo visibility permite crear páginas solo para usuarios registrados o para grupos concretos. Es útil para áreas de socios o documentación interna.
Cómo amplían los desarrolladores este modelo
Los desarrolladores amplían website.page con distintos patrones, siendo la herencia de modelos el mecanismo habitual.
Herencia de modelo
Usa _inherit = 'website.page' para extender el modelo. Puedes añadir campos, sobreescribir métodos o imponer restricciones. Mantener las extensiones en módulos separados facilita futuras actualizaciones.
Añadir campos
Declara nuevos campos en tu modelo heredado: Char, Many2one, Boolean, Integer, Text o Selection. Para entornos multiweb considera fields.website_dependent cuando proceda.
Extensiones en Python
Sobrescribe create, write o unlink para introducir lógica adicional. Llama a super() para mantener el comportamiento original. Ten cuidado con la relación view_id y su comportamiento en cascada.
Odoo Studio
Odoo Studio permite personalizar páginas sin programar. Es ideal para cambios rápidos de diseño; para lógica compleja o contenido alimentado por API, los módulos personalizados son más sostenibles.
Buenas prácticas
- Usa slugs amigables para la URL. Evita espacios y caracteres especiales; emplea guiones para mejorar la legibilidad y el SEO.
- Marca website_indexed en False para las páginas de agradecimiento, confirmación y cualquier contenido interno que no deba indexarse.
- Al cambiar una URL, configura una redirección (301 o 302) para preservar el valor SEO y evitar enlaces rotos.
- Rellena website_meta_title y website_meta_description en todas las páginas públicas para mejorar la visibilidad orgánica.
- Al crear páginas mediante API o XML-RPC, crea primero la ir.ui.view y después la website.page con view_id. Asegúrate de que la vista es de tipo qweb y tiene una key única.
Errores frecuentes
- Crear una website.page sin una view_id válida. La vista debe existir y ser de tipo qweb.
- Usar URLs que no comiencen por "\/". Odoo espera rutas como /contacto, no contact0.
- Olvidar desactivar website_indexed en páginas de agradecimiento. Si no se hace, pueden acabar en resultados de búsqueda y perjudicar al SEO.
- Cambiar la URL de una página sin implementar redirecciones. Los enlaces antiguos dejan de funcionar y los buscadores pierden la relación entre las páginas.
- Modificar el arch de una vista que fue editada en el constructor web. El flag noupdate en ir.model.data puede impedir que tus cambios XML se apliquen; puede ser necesario resetearlo.
Conclusión
El modelo website.page es la pieza central para gestionar páginas estáticas en Odoo. Almacena metadatos, rutas y ajustes de publicación; el contenido en sí reside en la ir.ui.view asociada.
Conocer sus campos y la forma en que hereda de ir.ui.view te permitirá configurar, personalizar e integrar sitios Odoo de forma más eficaz. Tanto si eres consultor funcional como desarrollador, dominar website.page evita errores y ahorra tiempo.
¿Necesitas ayuda con tu implantación de Odoo?
Dasolo acompaña a empresas en la implantación, personalización y optimización de Odoo. Somos especialistas en integraciones por API y desarrollo sobre Odoo, con experiencia profunda en la arquitectura de datos y modelos como website.page.
Si necesitas ayuda con tu implantación de Odoo, páginas web personalizadas o integraciones, podemos asesorarte y ejecutar el proyecto. Reserva una demo para hablar de tu proyecto.