Introduction
Quand vous parcourez la fiche produit d’une boutique Odoo, le texte soigné avec titres en gras, listes à puces et images intégrées provient souvent d’un seul type de champ : le champ Html. C’est un champ extrêmement flexible du modèle de données d’Odoo, utilisé bien au‑delà des seules fiches produits — newsletters, notes internes, pages web et documents PDF exploitent tous ce même stockage de contenu riche.
Contrairement à un simple champ texte qui garde des chaînes brutes, le champ Html conserve du contenu enrichi avec mise en forme. Il permet donc de gérer des textes structurés et stylés — descriptions commerciales, modèles d’e‑mail, contenus de site ou notes formatées — sans perdre les sauts de ligne, listes, liens ou images insérés par les utilisateurs.
Ce guide explique ce qu’est le champ Html, son comportement dans l’ORM et en base de données, les principaux usages métiers où il intervient, puis comment l’ajouter ou le personnaliser via Odoo Studio, module Python ou API. Nous abordons aussi les erreurs classiques à éviter pour garantir sécurité et maintenabilité.
Qu’est-ce que le champ Html dans Odoo
Dans l’ORM d’Odoo, un champ Html stocke une chaîne HTML dans une colonne de type TEXT en PostgreSQL. Odoo s’occupe du rendu côté interface et applique une couche de nettoyage (sanitization) afin que les utilisateurs voient un éditeur WYSIWYG convivial plutôt que du code HTML brut.
Côté utilisateur, le champ Html se présente sous la forme d’un éditeur visuel (WYSIWYG). On peut y appliquer du gras, des italiques, titres, listes, liens, tableaux et insérer des images. Tout est enregistré sous la forme d’un HTML structuré, prêt à être réaffiché ou imprimé.
Voici une illustration de définition du champ dans un modèle 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,
)
Le paramètre string définit le libellé visible. L’option sanitize indique si Odoo doit purger les portions HTML potentiellement dangereuses avant enregistrement — une protection importante activée par défaut pour limiter les risques XSS.
Dans Odoo Studio, ce type de champ apparaît sous les noms Html ou Rich Text. Studio génère alors un nom technique préfixé par x_studio_. En revanche, en Python ou via l’API vous choisissez vous‑même le nom technique du champ.
Comment fonctionne ce champ
Quand on déclare un champ Html, Odoo crée automatiquement une colonne TEXT dans la base PostgreSQL, sans contrainte de longueur — pratique pour les contenus volumineux. Le framework applique ensuite la logique de nettoyage avant l’écriture effective en base.
Sanitisation et sécurité
La particularité majeure du champ Html est sa couche de sanitization. Par défaut, Odoo élimine les balises et attributs susceptibles de servir à des attaques XSS. Ce comportement est piloté par plusieurs attributs du champ.
- sanitize : si True (valeur par défaut), Odoo applique le processus complet de nettoyage avant d’enregistrer. Ne désactivez cette option que si le contenu provient d’une source interne totalement fiable et nécessite le HTML brut.
- sanitize_tags : si True, Odoo supprime les balises HTML qui ne figurent pas sur la liste blanche. La désactivation permet d’autoriser des balises arbitraires, mais avec un risque évident pour la sécurité et la cohérence du rendu.
- sanitize_attributes : contrôle le nettoyage des attributs présents sur les balises HTML (comme href, src, data‑*…).
- sanitize_style : gère la purification des styles inline ; Odoo autorise certains styles sûrs et filtre ceux pouvant être problématiques.
- strip_style : si True, supprime complètement tous les attributs style inline.
- strip_classes : si True, supprime toutes les classes CSS des balises stockées.
Grâce à cette sanitization, le champ Html reste adapté au contenu fourni par des utilisateurs finaux — d’où son utilisation fréquente sur des formulaires clients ou des modèles d’e‑mail exposés à l’extérieur.
Attributs clés du champ
Au‑delà de la sanitization, le champ Html partage les attributs standards des champs Odoo.
- translate : si activé, le contenu HTML devient traduisible par langue. Odoo conserve une version distincte pour chaque langue active, utile pour boutiques multilingues et documents clients.
- required : rend le champ obligatoire. Attention : un champ Html rempli uniquement d’espaces ou de balises vides peut sembler non vide à l’interface, donc la validation required doit être pensée en conséquence.
- default : permet de préremplir le champ avec un HTML par défaut — pratique pour modèles d’e‑mail ou textes récurrents.
- compute : lie le champ à une méthode Python qui génère dynamiquement le HTML. Avec store=True, le résultat est persisté en base pour accélérer les lectures.
- copy : contrôle la duplication du contenu lors de la copie d’un enregistrement ; la valeur par défaut est True.
Apparence dans les vues
En vue formulaire, le champ Html s’affiche comme l’éditeur riche avec une barre d’outils. En vue liste, Odoo montre généralement un aperçu texte avec le HTML filtré pour garder la présentation lisible.
L’attribut widget en XML permet de piloter le rendu. Le widget par défaut est l’éditeur riche. Pour un affichage en lecture seule (par ex. sur une page portail ou dans un rapport), on peut utiliser le widget html afin d’afficher le contenu formaté sans barre d’édition.
Interaction avec l’ORM
Pour les développeurs, lire un champ Html renvoie la chaîne contenant le balisage HTML. Lorsqu’on écrit, il faut fournir du HTML ; la sanitization s’exécute côté ORM avant l’écriture en base, y compris pour les écritures via XML‑RPC quand sanitize=True.
Conséquence pratique : si votre contenu utilise des balises ou attributs personnalisés non autorisés, il faudra désactiver la sanitization ou ajuster les flags — une opération avancée qui demande d’évaluer les risques de sécurité sur votre installation.
Cas d’usage en entreprise
Où le champ Html est utilisé — exemples concrets
Inventaire et e‑commerce : descriptions produits
L’exemple le plus répandu est le champ description_sale sur product.template. C’est la description affichée sur la boutique en ligne et reprise dans les lignes de commande. Permettre aux équipes merchandising d’écrire des descriptions structurées avec images et listes améliore la présentation produit et favorise la conversion, sans duplication de contenu entre back‑office et vitrine web.
Email marketing : corps de modèles
Les modèles d’e‑mail s’appuient fortement sur des champs Html. Le body_html de mail.template contient le corps complet du message avec mise en page, images et placeholders dynamiques. Les marketeurs peuvent ainsi concevoir des e‑mails riches directement dans Odoo, réutilisables et versionnables pour campagnes et automatisations.
CRM : notes et description d’opportunités
Les équipes commerciales bénéficient de champs Html pour consigner des notes structurées sur un lead ou une opportunité. Listes, liens et mise en forme facilitent le partage d’informations détaillées entre collègues et la production de rapports imprimés lisibles.
Comptabilité : mentions sur factures
Les termes de paiement, clauses légales ou garanties apparaissent souvent en fin de facture ou de commande. Le champ note sur sale.order et account.move étant en Html, les équipes peuvent formater ces mentions pour qu’elles sortent correctement sur les PDFs clients.
RH : descriptions de postes
Pour les offres d’emploi publiées via le module Recrutement, la description du poste est un champ Html (hr.job / hr.applicant). Cela permet des annonces structurées — responsabilités, compétences, avantages — qui valorisent la page carrières et ciblent mieux les candidats.
Créer ou personnaliser un champ Html
Trois façons d’ajouter un champ Html selon votre contexte technique
Via Odoo Studio (sans code)
Odoo Studio permet d’ajouter simplement un champ Html sur un formulaire sans toucher au code.
- Ouvrez Odoo Studio depuis le menu principal.
- Allez sur le formulaire cible.
- Glissez le champ Html ou Rich Text depuis la barre latérale vers le formulaire.
- Définissez le libellé et les options dans le panneau propriétés.
- Sauvegardez et quittez Studio.
Studio crée le champ avec un préfixe x_studio_, met à jour la vue et gère la colonne en base — le champ est immédiatement disponible pour la saisie sur l’instance.
Via Python dans un module personnalisé
Pour les développements versionnés et déployables, on définit le champ dans un module Python — méthode recommandée en production.
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_instructions = fields.Html(
string='Delivery Instructions',
sanitize=True,
translate=True,
)
Après déclaration, ajoutez le champ à la vue XML correspondante. L’installation ou la mise à jour du module créera automatiquement la colonne TEXT en base et affichera l’éditeur riche en formulaire.
Via l’API XML‑RPC
Si vous gérez des configurations à distance, il est possible de créer un champ Html via l’API 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',
}]
)
En précisant ttype: 'html', Odoo crée un champ Html. L’état manual indique qu’il s’agit d’un champ créé par l’utilisateur plutôt que par un module. Cette méthode est utile pour scripts d’automatisation et déploiements sans accès direct au code serveur.
Notez que certaines options de sanitization ne sont pas paramétrables via ir.model.fields depuis l’API ; le comportement par défaut s’applique pour les champs créés ainsi.
Bonnes pratiques
1. Laissez sanitize activé sauf raison majeure
La sanitization protège votre instance contre les vulnérabilités XSS. Dans la plupart des cas, elle doit rester activée. Ne la désactivez que pour du contenu produit par un processus serveur interne fiable et documenté — jamais pour du contenu entré par des utilisateurs externes.
2. Activez translate=True pour le contenu multilingue
Sur une instance multilingue, pensez à set translate=True pour les descriptions produits ou modèles d’e‑mail destinés aux clients. Cela permet de maintenir un HTML distinct par langue et d’éviter d’afficher des contenus dans la mauvaise langue.
3. Évitez les dépendances sur des ressources externes
Intégrer des images ou scripts externes dans un champ Html crée des dépendances fragiles : URL cassées peuvent dégrader l’affichage. Préférez héberger les images en pièces‑jointes dans Odoo et utiliser des chemins internes ou relatifs pour garantir la portabilité lors de migrations.
4. Utilisez des champs Html calculés pour du contenu dynamique
Pour des contenus générés (ex. sommaire formaté d’une commande), un champ compute avec store=True centralise la logique, produit un HTML réutilisable et accélère l’affichage dans l’interface et les rapports PDF.
5. Choisissez Html ou Text selon le besoin de rendu
Si le texte sera lu uniquement en backend sans mise en forme nécessaire, un champ Text suffit. Réservez Html aux situations où la mise en forme compte réellement (site web, PDF, e‑mail). Multiplier les éditeurs riches pour des notes simples complique l’usage pour les utilisateurs.
Pièges fréquents
Désactiver sanitize et l’oublier
Désactiver sanitize pour contourner un blocage pendant le dev est tentant, mais oubliez‑le avant mise en production et vous introduirez un risque. Documentez toujours la raison d’une désactivation et prévoyez une revue de sécurité avant déploiement.
Coller depuis Word ou autres sources avec du HTML cassé
Le collage depuis Word, Google Docs ou d’autres sites peut produire un HTML sale : balises inutiles, caractères invisibles, ou génération de contenu lourd qui altère le rendu et les recherches. Incitez les utilisateurs à coller en texte brut puis reformater dans l’éditeur Odoo.
Confondre champ Html et contenu du constructeur de site
Le constructeur de site Odoo génère du HTML structuré autour de composants et blocs Owl — ce n’est pas le même HTML qu’un simple champ Html de modèle. Copier du HTML complexe du constructeur de site vers un champ Html de modèle conduit souvent à un rendu incorrect ou au filtrage par le sanitizer.
Oublier translate sur une instance multilingue
Sans translate=True, un champ Html affichera le même contenu pour tous les utilisateurs, quel que soit leur langage. Cela pose problème pour descriptions produits, e‑mails et documents clients. Ce paramètre est facile à manquer lors du déploiement initial et coûteux à corriger après saisie de contenus.
Placer du Html là où du texte est attendu
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.
Conclusion
Le champ Html est l’un des plus puissants du modèle Odoo. Il alimente discrètement descriptions produit, modèles d’e‑mail, offres d’emploi et mentions de factures, permettant un contenu formaté sans outils externes.
Comprendre son fonctionnement — en particulier la sanitization, la traduction et les différents contextes d’affichage — vous aide à décider où et comment l’utiliser lors de la conception ou de la personnalisation d’une instance Odoo. Que vous passiez par Studio, par un module Python ou par l’API, les principes exposés s’appliquent partout.
Comme pour beaucoup de choses dans Odoo, le mécanisme est simple quand on connaît les dessous. La vraie valeur vient du bon usage : placer le champ Html là où la mise en forme importe et le configurer correctement pour la sécurité et la maintenance.
Chez Dasolo, nous accompagnons les entreprises dans l’implémentation, la personnalisation et l’optimisation d’Odoo dans tous les services. Qu’il s’agisse de modélisation de données propre, d’ajout de champs adaptés ou de développement de modules sur mesure, notre équipe peut vous aider. Contactez‑nous et échangeons sur votre projet Odoo.