Ir al contenido

Campo HTML en Odoo: Guía Completa para Dominarlo

Guía práctica sobre el campo Html en el modelo de datos de Odoo: qué es, cómo usarlo y cómo personalizarlo técnicamente
6 de marzo de 2026 por
Campo HTML en Odoo: Guía Completa para Dominarlo
Dasolo
| Sin comentarios aún

Introducción


Cuando navegas por una ficha de producto en una tienda hecha con Odoo, ese texto bien estructurado con títulos en negrita, listas y fotos no es magia: proviene de un único tipo de campo: el campo Html. Es, probablemente, uno de los elementos más flexibles del modelo de datos de Odoo y aparece en sitios que muchos usuarios no sospechan.


A diferencia de un campo de texto simple que guarda cadenas sin formato, el campo Html almacena contenido enriquecido con formato completo. Por eso es la opción elegida siempre que haga falta texto con estructura o estilo —desde la descripción de un producto hasta plantillas de correo, notas internas o secciones del sitio web—.


En esta guía explico qué es el campo Html, cómo lo gestiona el ORM y la base de datos de Odoo, en qué flujos de trabajo empresariales se utiliza habitualmente y cómo añadirlo o modificarlo usando Odoo Studio o código Python. También repaso las equivocaciones más frecuentes y cómo evitarlas.

¿Qué es el campo Html en Odoo?


Dentro del ORM de Odoo, el campo Html está pensado para guardar contenido HTML con formato. En la base de datos se materializa como una columna TEXT en PostgreSQL y lo que se almacena es una cadena HTML. Odoo se encarga de renderizarla y de aplicar limpieza (sanitización), de forma que el usuario interactúa con un editor enriquecido en lugar de ver código bruto.


Para el usuario, el Html se presenta como un editor WYSIWYG: un editor visual donde aplicar negritas, cursivas, encabezados, listas, enlaces, tablas o insertar imágenes. Todo lo que se crea ahí se guarda como HTML estructurado detrás del interfaz.


Así se declara el campo en un modelo Python:

from odoo import fields, models

class ProductTemplate(models.Model):
    _inherit = 'product.template'

    x_technical_specs = fields.Html(
        string='Technical Specifications',
        sanitize=True,
        sanitize_tags=True,
    )

El parámetro string define la etiqueta visible en los formularios. El parámetro sanitize activa la limpieza de HTML potencialmente peligroso antes de guardar: una protección clave que viene habilitada por defecto.


Si lo creas desde Odoo Studio, este tipo de campo aparece como Html o Rich Text y recibe automáticamente el prefijo x_studio_. Si lo defines en Python o mediante APIs, eres tú quien elige el nombre técnico.

Cómo funciona el campo


Al definir un campo Html, Odoo crea una columna TEXT en PostgreSQL sin límite de longitud, lo que lo hace adecuado para contenidos extensos. La capa de sanitización de Odoo se ejecuta antes de persistir el contenido en la base de datos.


Sanitización y seguridad

La característica que diferencia claramente al campo Html de otros tipos es su capa de sanitización. Por defecto, Odoo elimina etiquetas y atributos que podrían facilitar ataques XSS (cross-site scripting). Esta limpieza se controla mediante varios atributos del campo:

  • sanitize: cuando es True (por defecto), Odoo aplica el proceso completo de sanitización antes de guardar. Solo deberías desactivarlo si la fuente del HTML es totalmente de confianza y necesitas conservar HTML en bruto.
  • sanitize_tags: con True, Odoo elimina etiquetas HTML que no estén en la lista permitida. Desactivarlo permite etiquetas arbitrarias, pero incrementa el riesgo.
  • sanitize_attributes: controla si los atributos de las etiquetas HTML también se filtran.
  • sanitize_style: regula la limpieza de estilos inline; por defecto se permiten ciertas propiedades seguras y se eliminan las potencialmente peligrosas.
  • strip_style: si es True, elimina por completo los atributos de estilo inline.
  • strip_classes: si es True, elimina los atributos de clase CSS del contenido almacenado.

Gracias a esta sanitización, el campo Html es una opción segura para contenido introducido por los usuarios, motivo por el que lo verás en formularios orientados al cliente y en plantillas de correo dentro de Odoo.


Atributos clave del campo

Además de la sanitización, el Html comparte muchos atributos habituales de los campos en Odoo:


  • translate: cuando está activado, el contenido del campo se puede traducir por idioma. Odoo guarda versiones separadas del HTML para cada idioma activo.
  • required: hace el campo obligatorio. Ten en cuenta que un Html con solo espacios o etiquetas vacías puede parecer no vacío en la interfaz, así que la validación funciona mejor sobre valores verdaderamente nulos.
  • default: permite establecer un HTML por defecto para nuevos registros —útil para plantillas de correo o descripciones de producto frecuentes.
  • compute: enlaza con un método Python que genera el HTML dinámicamente. Si pones store=True el resultado se persiste en la base de datos.
  • copy: controla si el contenido se duplica al copiar un registro; por defecto es True.

Cómo se muestra en las vistas

En las vistas de formulario, el Html aparece como editor enriquecido con una barra de herramientas de formato y un área para texto, imágenes y enlaces. En vistas de lista, Odoo suele mostrar una vista previa en texto plano con las etiquetas HTML eliminadas para mantener la legibilidad.


El atributo widget en las vistas XML permite ajustar la presentación. El widget por defecto es el editor enriquecido; si necesitas mostrar HTML ya renderizado sin barra de edición, usa el widget html (por ejemplo en informes o en el portal).


Interacción con el ORM de Odoo

Para desarrolladores, leer un campo Html devuelve una cadena con el marcado HTML; escribir en él espera también una cadena HTML. La sanitización se aplica en el nivel del ORM antes de que el valor llegue a la base de datos, así que incluso operaciones vía XML-RPC pasan por el mismo filtrado si sanitize=True.


Consecuencia práctica: si necesitas guardar etiquetas o atributos personalizados que no están en la lista permitida por Odoo, tendrás que desactivar sanitize o ajustar las banderas de sanitización en la definición del campo. Es una opción avanzada que exige evaluar cuidadosamente los riesgos de seguridad.

Casos de uso en la empresa


El campo Html está presente en múltiples áreas de una implantación Odoo. Abajo tienes cinco ejemplos reales de uso en flujos empresariales comunes.


Inventario y comercio electrónico: descripciones de producto

El uso más habitual del campo Html en Odoo es la descripción de venta (description_sale) en product.template. Es la información que ve el cliente en la tienda online y en las líneas de pedido. Permite a los equipos de producto redactar descripciones con listas, secciones y fotos embebidas, lo que contribuye a mejorar las conversiones en comercio electrónico y evita duplicar contenidos entre back-office y escaparate.


Email marketing: cuerpo de plantillas

Las plantillas de correo en Odoo usan intensamente campos Html. El body_html en mail.template guarda el cuerpo del correo con maquetación, imágenes y marcadores dinámicos que se reemplazan al enviar. Los equipos de marketing pueden diseñar emails enriquecidos dentro de Odoo sin herramientas externas, y reutilizar esos diseños en campañas, presupuestos y automatizaciones.


CRM: notas y descripciones de oportunidades

Los equipos comerciales necesitan registrar contexto detallado sobre un prospecto o una oportunidad. Los campos Html en leads y oportunidades permiten notas estructuradas, con listas y enlaces a documentos externos, lo cual resulta muy útil cuando la información se comparte con el equipo o se incluye en informes impresos.


Contabilidad: condiciones en facturas

Muchas empresas colocan condiciones de pago, cláusulas legales o garantías al pie de facturas y pedidos. El campo note en pedidos y facturas es Html, lo que permite dar formato a esos textos y conseguir que aparezcan correctamente en PDFs impresos, con saltos de línea y enfatizados tal como se redactaron.


RR. HH.: descripciones de ofertas

En los procesos de selección de Odoo, las descripciones de puesto se almacenan en campos Html (hr.job y hr.applicant). Así se publican ofertas con secciones claras de responsabilidades, requisitos y beneficios, un formato que resulta profesional en la web de empleo y atrae candidatos adecuados.

Crear o personalizar un campo Html


Existen tres vías principales para añadir un campo Html a un modelo Odoo, según tu entorno y política de despliegue.


Mediante Odoo Studio (sin escribir código)

Odoo Studio facilita añadir un campo Html a cualquier formulario sin programar:

  1. Abre Odoo Studio desde el menú principal.
  2. Sitúate en el formulario donde deseas añadir el campo.
  3. Arrastra desde la barra lateral un campo Html o Rich Text hasta el formulario.
  4. Configura la etiqueta y las opciones desde el panel de propiedades.
  5. Guarda y cierra Studio.

Studio crea la columna en la base de datos con prefijo x_studio_, inserta el campo en la vista y lo deja listo para usar al instante, sin pasos adicionales de despliegue.


Mediante Python en un módulo personalizado

Para desarrolladores, definir campos Html en el código del módulo es la vía recomendada cuando necesitas control de versiones y despliegues entre entornos:


from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_delivery_instructions = fields.Html(
        string='Delivery Instructions',
        sanitize=True,
        translate=True,
    )

Tras declarar el campo en el modelo, hay que añadirlo a la vista XML correspondiente. Al instalar o actualizar el módulo, Odoo crea la columna TEXT en la base de datos y el campo se renderiza automáticamente como editor enriquecido en el formulario.


Mediante la API XML-RPC

Si gestionas personalizaciones de forma programática (scripts de despliegue o pipelines), puedes crear campos Html mediante XML-RPC:

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_custom_notes',
        'field_description': 'Custom Notes',
        'model_id': model_id,
        'ttype': 'html',
        'state': 'manual',
    }]
)

El valor ttype: 'html' indica a Odoo que cree un campo Html. El state: 'manual' lo marca como campo creado por el usuario. Este método es práctico para automatizar configuraciones en clientes sin acceso directo al servidor.


Ten en cuenta que ciertas opciones de sanitización (sanitize, sanitize_tags, etc.) no siempre se pueden ajustar vía ir.model.fields desde la API como se haría en Python; al crear campos por API se aplican los valores por defecto de sanitización.

Buenas prácticas


1. Mantén sanitize activado salvo que haya una razón muy sólida para no hacerlo

La sanitización protege Odoo frente a vulnerabilidades XSS. La mayoría de casos funcionan correctamente con sanitize activo. Solo desactívalo si el contenido procede de un proceso totalmente confiable (por ejemplo, una generación server-side controlada) y nunca para contenido introducido por usuarios externos.


2. Usa translate=True para contenidos multilingües

Si tu instancia es multidioma, los campos Html destinados al sitio web o a documentos para clientes deben tener translate=True. Así cada idioma puede mantener su propia versión HTML y el cliente verá el contenido en su idioma en lugar de un texto de respaldo.


3. Evita depender de recursos externos en el HTML

Insertar imágenes o scripts desde URLs externas crea dependencias que pueden romperse si esas rutas cambian o dejan de estar disponibles. Usa el sistema de adjuntos de Odoo y referéncialos con URLs relativas para que el contenido sea portátil y resistente ante migraciones o cambios de servidor.


4. Emplea campos Html computados para contenido dinámico

Si necesitas generar contenido mediante lógica —por ejemplo, un resumen formateado de líneas de pedido o cláusulas que cambian según condiciones— un campo compute con store=True ofrece una solución limpia: la lógica centralizada produce HTML que se guarda para un acceso rápido y se muestra correctamente tanto en la interfaz como en los informes PDF.


5. Piensa en el contexto de renderizado antes de elegir Html frente a Text

Si el contenido solo se leerá en backend sin formato, un campo Text puede bastar. Usa Html cuando el formato importe realmente (página web, documento impreso, correo). Introducir un editor enriquecido donde no hace falta complica la experiencia del usuario.

Errores comunes


Desactivar sanitize y olvidarlo

Poner sanitize=False en un campo editable por usuarios es un riesgo de seguridad. Suele hacerse en desarrollo para solucionar rápidamente un requisito de formato y después se olvida. Documenta siempre la decisión y revisa antes de pasar a producción.


Pegar contenido desde Word o páginas web con HTML defectuoso

Al pegar desde Word, Google Docs o sitios web, el HTML resultante suele estar desordenado o usar etiquetas no estándar. Esto provoca renderizados incoherentes, caracteres invisibles que rompen búsquedas o contenidos hinchados que ralentizan las páginas. Recomienda usar “Pegar como texto sin formato” y reaplicar formato desde el editor de Odoo.


Confundir el Html estándar con el contenido del diseñador web

El constructor de sitios de Odoo usa bloques y componentes (Owl) cuya HTML no es equivalente al de un campo Html normal. Copiar HTML complejo del constructor al campo de un modelo suele fallar o ser filtrado por el sanitizador.


Olvidar activar translate en despliegues multilingües

En instancias multidioma, un Html sin translate=True mostrará el mismo contenido a todos los usuarios. Es aceptable para campos internos, pero problemático en descripciones de producto, plantillas de correo o cualquier contenido dirigido a clientes. Detectarlo y corregirlo a posteriori es tedioso.


Usar Html donde se espera texto plano

Some parts of Odoo, such as email subjects, report titles, or external API responses, expect plain text strings. If you store an Html field value in a context where the HTML tags are not stripped, your users will see raw markup like <p>Hello</p> instead of clean text. Always check how and where the field value will be consumed before choosing Html over Char or Text.

Conclusión


El campo Html es, sin duda, uno de los más potentes del modelo de datos de Odoo. Actúa tras las descripciones de producto, plantillas de correo, ofertas de empleo y notas de factura, permitiendo contenido formateado en todo el sistema sin herramientas adicionales.


Comprender su funcionamiento —especialmente la sanitización, el soporte de traducciones y su comportamiento según el contexto de renderizado— te ayudará a tomar mejores decisiones al diseñar o personalizar una implantación Odoo. Ya sea que uses Studio, definas el campo en Python o lo crees vía API, los principios de esta guía aplican en los tres casos.


Como en muchas áreas de Odoo, el campo Html es sencillo cuando entiendes qué sucede bajo el capó. El valor real está en usarlo en los lugares adecuados, con los ajustes correctos y para el tipo de contenido apropiado.

En Dasolo acompañamos a empresas en la implementación, personalización y optimización de Odoo en todos los departamentos. Si necesitas ayuda con un modelo de datos limpio, añadir campos personalizados o crear módulos a medida, podemos ayudarte. Contáctanos y conversemos sobre tu proyecto Odoo.

Campo HTML en Odoo: Guía Completa para Dominarlo
Dasolo 6 de marzo de 2026
Compartir esta publicación
Iniciar sesión para dejar un comentario