Introducción
Cuando miras la descripción de un producto en una tienda de comercio electrónico de Odoo, el texto formateado con encabezados en negrita, viñetas e imágenes es impulsado por un solo tipo de campo: el campo Html. Es uno de los campos más versátiles en el modelo de datos de Odoo, y aparece en más lugares de los que la mayoría de los usuarios se da cuenta.
A diferencia de un campo de texto simple que almacena cadenas simples, el campo Html almacena contenido enriquecido con formato completo. Esto lo hace esencial en cualquier lugar donde los usuarios necesiten escribir texto estructurado o estilizado, ya sea una descripción de producto, una plantilla de correo electrónico, una nota interna o una sección de un sitio web.
Esta guía cubre qué es el campo Html, cómo funciona en el ORM y la base de datos de Odoo, dónde se utiliza en flujos de trabajo empresariales reales, y cómo crear o personalizarlo utilizando Odoo Studio o código Python. También cubrimos los errores más comunes que la gente comete al trabajar con este tipo de campo.
¿Qué es el campo Html en Odoo?
En el ORM de Odoo, el campo Html está diseñado para almacenar contenido HTML formateado. Se mapea a una columna TEXT en PostgreSQL, y el valor almacenado es una cadena HTML. Odoo maneja automáticamente el renderizado y la sanitización, por lo que lo que los usuarios ven en la interfaz es un editor de texto enriquecido completamente formateado, no código HTML en bruto.
Desde la perspectiva del usuario, un campo Html aparece como un editor WYSIWYG (Lo Que Ves Es Lo Que Obtienes). Los usuarios pueden aplicar negrita, cursiva, encabezados, listas, enlaces, tablas e incluso insertar imágenes directamente en el campo. El resultado se guarda como HTML estructurado en segundo plano.
Así es como se ve el campo en una definición de modelo de Python:
from odoo import fields, models
class ProductTemplate(models.Model):
_inherit = 'product.template'
x_technical_specs = fields.Html(
string='Especificaciones Técnicas',
sanitize=True,
sanitize_tags=True,
)
El parámetro string establece la etiqueta visible. El parámetro sanitize controla si Odoo elimina HTML potencialmente peligroso antes de guardar el valor. Esto es importante por razones de seguridad y está habilitado por defecto.
En Odoo Studio, este tipo de campo se llama Html o Texto Enriquecido. Cuando se crea a través de Studio, recibe un prefijo x_studio_. Cuando se define en Python o a través de la API XML-RPC, eliges el nombre técnico tú mismo.
Cómo funciona el campo
Cuando defines un campo Html en Odoo, el marco crea una columna TEXT en la base de datos PostgreSQL. No hay una restricción de longitud a nivel de base de datos, lo que lo hace adecuado para contenido extenso. El marco de Odoo gestiona la capa de sanitización antes de que el valor se escriba en la base de datos.
Sanitización y Seguridad
El comportamiento más distintivo del campo Html en comparación con otros tipos de campo es su capa de sanitización. Por defecto, Odoo elimina cualquier etiqueta o atributo HTML que podría ser utilizado para ataques de scripting entre sitios (XSS). Esto se controla mediante un conjunto de atributos de campo:
- sanitize: Cuando
True(el valor por defecto), Odoo aplica el proceso completo de sanitización antes de guardar el valor. Establecerlo enFalsesolo cuando estés seguro de que el contenido proviene de una fuente confiable y debe preservar HTML sin procesar. - sanitize_tags: Cuando
True, Odoo elimina cualquier etiqueta HTML que no esté en la lista permitida. Deshabilitar esto permite etiquetas arbitrarias, pero debe hacerse con precaución. - sanitize_attributes: Controla si los atributos en las etiquetas HTML también son sanitizados.
- sanitize_style: Controla si los atributos de estilo en línea son sanitizados. Por defecto, se permiten ciertas propiedades CSS mientras que las potencialmente peligrosas son eliminadas.
- strip_style: Cuando
True, elimina todos los atributos de estilo en línea por completo. - strip_classes: Cuando
True, elimina todos los atributos de clase CSS del contenido almacenado.
Esta sanitización hace que el campo Html sea seguro para usar con contenido generado por el usuario, razón por la cual aparece en formularios y plantillas de correo electrónico orientados al cliente en Odoo.
Atributos Clave del Campo
Más allá de la sanitización, el campo Html comparte muchos de los atributos estándar de los campos de Odoo:
- translate: Cuando se establece en
True, el contenido del campo se puede traducir por idioma. Odoo almacena una versión separada del HTML para cada idioma activo en la base de datos. - required: Hace que el campo sea obligatorio. Tenga en cuenta que un campo Html que contenga solo espacios en blanco o etiquetas vacías seguirá apareciendo no vacío en la interfaz, por lo que la validación requerida funciona mejor en valores realmente en blanco.
- default: Establece un valor HTML predeterminado para nuevos registros. Útil para pre-poblar plantillas de correo electrónico o descripciones de productos con texto estándar.
- compute: Vincula un método de Python que construye el contenido HTML dinámicamente. Con
store=True, el resultado se persiste en la base de datos. - copy: Controla si el contenido HTML se duplica al copiar un registro. Por defecto es
True.
Cómo Aparece en las Vistas
En las vistas de formulario, un campo Html se renderiza como el editor de texto enriquecido de Odoo. Los usuarios obtienen una barra de herramientas con opciones de formato y el área de contenido maneja texto con estilo, imágenes y enlaces. En las vistas de lista, Odoo normalmente muestra una vista previa de texto plano con etiquetas HTML eliminadas, para mantener la lista legible.
El atributo widget en las vistas XML te permite controlar el renderizado. El widget predeterminado para los campos Html es el editor de texto enriquecido. También puedes renderizar un campo Html como salida HTML de solo lectura utilizando el widget html, lo cual es útil en vistas de informes o en páginas de portal donde deseas mostrar contenido formateado sin una barra de herramientas editable.
Interacción con el ORM de Odoo
Desde el punto de vista del desarrollo, leer un campo Html devuelve una cadena que contiene el marcado HTML sin procesar. Escribir en él también espera una cadena HTML. La sanitización ocurre a nivel de ORM antes de que la escritura llegue a la base de datos, por lo que incluso los valores escritos a través de la API XML-RPC pasan por el mismo proceso de limpieza cuando sanitize=True.
Una implicación práctica: si necesitas almacenar y recuperar contenido que incluya etiquetas o atributos HTML personalizados que no están en la lista permitida de Odoo, deberás establecer sanitize=False o ajustar las flags de sanitización en la definición del campo. Este es un caso de uso avanzado que requiere una cuidadosa consideración de las implicaciones de seguridad en tu implementación.
Casos de uso empresarial
El campo Html aparece en muchas áreas de una implementación de Odoo. Aquí hay cinco ejemplos del mundo real de flujos de trabajo empresariales comunes.
Inventario y Comercio Electrónico: Descripciones de Productos
El campo Html más utilizado en Odoo es el campo description_sale en product.template. Esta es la descripción del producto que los clientes ven en la tienda del sitio web y en las líneas de órdenes de venta. Usar un campo Html aquí permite a los equipos de merchandising escribir contenido estructurado del producto con viñetas, encabezados e imágenes incrustadas, todo lo cual se traduce directamente en mejores conversiones de comercio electrónico. El mismo registro de producto alimenta tanto la oficina administrativa como la tienda, por lo que no hay duplicación de contenido entre sistemas.
Email Marketing: Cuerpos de Plantillas
Las plantillas de correo electrónico de Odoo dependen en gran medida de los campos Html. El campo body_html en mail.template almacena todo el cuerpo del correo electrónico como HTML, incluyendo diseño, imágenes y marcadores de posición dinámicos que se reemplazan con valores reales en el momento del envío. Los equipos de marketing pueden diseñar contenido de correo electrónico enriquecido directamente en Odoo sin necesidad de una herramienta externa de diseño de correos. El contenido está versionado y es reutilizable en campañas, cotizaciones y flujos de trabajo automatizados.
CRM: Notas y Descripciones de Oportunidades
Los equipos de ventas a menudo necesitan capturar un contexto detallado sobre un prospecto o trato. Los campos Html en los leads y oportunidades de CRM permiten a los representantes escribir notas estructuradas con formato, listas y enlaces incrustados a documentos o propuestas externas. Esto es más útil que los campos de texto plano cuando las notas necesitan ser compartidas entre un equipo o incluidas en informes impresos, ya que el formato se conserva en todos estos contextos.
Contabilidad: Términos y Condiciones de Factura
Muchas empresas incluyen términos de pago, cláusulas legales o información sobre garantías al final de las facturas y órdenes de venta. El campo note en las órdenes de venta y facturas es un campo Html, lo que permite a los equipos de finanzas y operaciones formatear estos términos con la estructura adecuada. El contenido aparece de manera limpia en los documentos PDF impresos, con saltos de línea y énfasis preservados exactamente como se ingresaron.
RRHH: Descripciones de Puestos de Trabajo
Cuando los equipos de RRHH publican ofertas de trabajo a través de Odoo Recruitment, la descripción del puesto se almacena en un campo Html en los modelos hr.job y hr.applicant. Esto permite publicaciones de trabajo estructuradas con secciones claras para responsabilidades, requisitos y beneficios, exactamente el tipo de contenido formateado que se ve profesional en una página de carreras y ayuda a atraer a los candidatos adecuados.
Creación o personalización del campo Html
Hay tres formas principales de agregar un campo Html a un modelo de Odoo, dependiendo de su configuración técnica y enfoque de implementación.
Usando Odoo Studio (Sin Código)
Odoo Studio facilita la adición de un campo Html a cualquier formulario existente sin escribir código:
- Abre Odoo Studio desde el menú principal.
- Navega hasta el formulario donde deseas el campo.
- Desde la barra lateral, arrastra un campo Html o Texto Enriquecido al formulario.
- Establece la etiqueta y cualquier otra opción en el panel de propiedades del campo.
- Guarda y cierra Studio.
Studio crea automáticamente el campo con un prefijo x_studio_, lo agrega a la vista y maneja la columna de la base de datos. No se necesita ningún paso de migración o implementación de tu parte. El campo está inmediatamente disponible para la entrada de datos en toda la instancia.
Usando Python en un Módulo Personalizado
Para los desarrolladores que construyen módulos de Odoo, los campos Html se definen en archivos de modelo de Python. Este enfoque se recomienda para cualquier personalización que necesite ser controlada por versiones y desplegada en entornos de staging y producción:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_instructions = fields.Html(
string='Instrucciones de Entrega',
sanitize=True,
translate=True,
)
Después de definir el campo en el modelo, agrégalo al archivo XML de vista relevante para que aparezca en la interfaz. Odoo maneja la creación de la columna TEXT en la base de datos automáticamente cuando instalas o actualizas el módulo. El campo se renderizará como un editor de texto enriquecido en la vista de formulario sin ninguna configuración adicional del widget.
Usando la API XML-RPC
Si gestionas personalizaciones de Odoo programáticamente como parte de un pipeline de despliegue o un script de configuración remota, puedes crear campos Html a través de la API XML-RPC:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_notes',
'field_description': 'Notas Personalizadas',
'model_id': model_id,
'ttype': 'html',
'state': 'manual',
}]
)
El valor ttype: html le indica a Odoo que cree un campo Html. La configuración state: manual lo marca como un campo creado por el usuario en lugar de uno definido por un módulo. Este es el mismo enfoque que utiliza Dasolo para la creación remota de campos en entornos de clientes, como parte de cuadernos de configuración automatizados que se pueden ejecutar y rastrear sin acceso directo al servidor.
Ten en cuenta que las opciones de sanitización (sanitize, sanitize_tags, etc.) no se pueden establecer a través de la API en ir.model.fields de la misma manera que se hace en Python. El comportamiento de sanitización predeterminado se aplica al crear campos a través de la API.
Mejores prácticas
1. Mantén la sanitización habilitada a menos que tengas una razón de peso para no hacerlo
El comportamiento de sanitización predeterminado existe para proteger tu instancia de Odoo de vulnerabilidades de scripting entre sitios. La mayoría de los casos de uso funcionan perfectamente con la sanitización activada. Solo desactívala cuando estés almacenando contenido generado por un proceso interno completamente confiable, como un pipeline de renderizado del lado del servidor, y nunca cuando el contenido provenga de la entrada del usuario o fuentes externas.
2. Usa translate=True para contenido de productos multilingües
Si su instancia de Odoo admite múltiples idiomas, los campos Html que se muestran en el sitio web o en documentos orientados al cliente deben tener translate=True. Esto permite que su equipo mantenga contenido HTML separado para cada idioma, asegurando que los clientes siempre vean descripciones y términos en su propio idioma en lugar de un recurso alternativo.
3. Evite almacenar contenido de campos Html que dependa de recursos externos
Incrustar imágenes o scripts externos dentro de un campo Html crea dependencias que pueden romperse silenciosamente cuando esas URL externas cambian o se desconectan. Utilice el sistema de adjuntos de Odoo para alojar imágenes internamente y refiéralas con URL relativas. Esto mantiene su contenido portátil y resistente a través de migraciones de base de datos y cambios de servidor.
4. Utilice campos Html calculados para contenido de documentos dinámicos
Para contenido que necesita ser construido programáticamente, como un resumen formateado de líneas de pedido o una cláusula de garantía dinámica, un campo Html calculado con store=True es una solución limpia. La lógica de cálculo vive en un solo lugar, la salida se almacena en la base de datos para un acceso rápido, y el campo se renderiza correctamente tanto en la interfaz como en los informes PDF.
5. Considere el contexto de renderizado al elegir Html vs Texto
Si el contenido solo aparecerá en el backend de Odoo en un contexto donde los usuarios lo lean como texto plano, un campo de Texto puede ser suficiente. Utilice Html cuando el formato realmente importe para el lector, como en una página web, un documento impreso o un correo electrónico. Agregar un campo Html donde un campo de Texto plano sería suficiente introduce una complejidad innecesaria para los usuarios que tienen que interactuar con un editor de texto enriquecido para tomar notas simples.
Errores comunes
Desactivar la sanitización y olvidarse de ello
Configurar sanitize=False en un campo que los usuarios pueden editar directamente es un riesgo de seguridad. Es fácil hacer esto durante el desarrollo para desbloquear un requisito de formato y luego olvidar revisarlo antes de pasar a producción. Siempre documente por qué se desactiva la sanitización y planifique una revisión antes del despliegue.
Pegar contenido de fuentes externas con HTML roto
Cuando los usuarios pegan contenido de documentos de Word, Google Docs o sitios web en un campo Html, el resultado a menudo contiene HTML desordenado o no estándar. Esto puede llevar a un renderizado inconsistente, caracteres invisibles que rompen búsquedas, o valores de campo inflados que ralentizan la carga de páginas. Anime a los usuarios a utilizar primero la opción "Pegar como texto plano" y luego reaplicar el formato dentro del editor de Odoo.
Confundir el campo Html con el contenido del constructor de sitios web
El constructor de sitios web de Odoo utiliza bloques de construcción y componentes Owl para construir el contenido de la página. El HTML almacenado por el constructor de sitios web en las vistas de página no es el mismo que el que pondrías en un campo Html estándar. Intentar copiar HTML complejo del constructor de sitios web en un campo Html en un modelo generalmente no se renderizará correctamente y puede ser eliminado por el sanitizador.
Olvidar traducir en implementaciones multilingües
En una instancia multilingüe de Odoo, un campo Html sin translate=True muestra el mismo contenido a usuarios de todos los idiomas. Esto está bien para campos internos, pero se convierte en un problema para descripciones de productos, plantillas de correo electrónico y cualquier contenido que llegue a contactos externos. Pasar por alto esta configuración es fácil durante la configuración inicial y difícil de corregir retroactivamente una vez que el contenido ha sido ingresado en solo un idioma.
Usar campos Html en lugares donde se espera texto plano
Algunas partes de Odoo, como los asuntos de correo electrónico, los títulos de informes o las respuestas de API externas, esperan cadenas de texto plano. Si almacenas un valor de campo Html en un contexto donde las etiquetas HTML no son eliminadas, tus usuarios verán marcado en bruto como <p>Hola</p> en lugar de texto limpio. Siempre verifica cómo y dónde se consumirá el valor del campo antes de elegir Html sobre Char o Text.
Conclusión
El campo Html es uno de los tipos de campo más poderosos en el modelo de datos de Odoo. Se encuentra silenciosamente detrás de descripciones de productos, plantillas de correo electrónico, publicaciones de trabajo y notas de facturas, haciendo posible el contenido formateado en todo el sistema sin ninguna herramienta adicional.
Entender cómo funciona, particularmente la capa de sanitización, el soporte de traducción y cómo se comporta en diferentes contextos de renderizado, te ayuda a tomar mejores decisiones al diseñar o personalizar una instancia de Odoo. Ya sea que estés utilizando Odoo Studio para agregar un campo de texto enriquecido a un formulario, definiéndolo en Python como parte de un módulo personalizado, o creándolo de forma remota a través de la API, los principios cubiertos en esta guía se aplican a los tres enfoques.
Como la mayoría de las cosas en Odoo, el campo en sí es sencillo una vez que sabes lo que está haciendo bajo el capó. El valor proviene de usarlo en los lugares correctos, con la configuración correcta, para el tipo correcto de contenido.
En Dasolo, ayudamos a las empresas a implementar, personalizar y optimizar Odoo en todos los departamentos. Ya sea que necesites ayuda para diseñar un modelo de datos limpio, agregar campos personalizados a tus flujos de trabajo, o construir módulos completos de Odoo adaptados a tu negocio, nuestro equipo está aquí. Contáctanos y hablemos sobre tu proyecto de Odoo.