Introduction
Le champ Char représente l’un des types de données les plus utilisés dans Odoo. Que ce soit le nom d’un contact, un code produit ou une référence de commande, vous le voyez constamment — souvent sans le remarquer — car il sert à stocker de courts textes identifiants et lisibles par l’utilisateur.
Que vous soyez administrateur qui ajuste des écrans avec Odoo Studio, développeur qui écrit des modules ou consultant qui structure l’ERP d’un client, maîtriser ce type de champ facilite la configuration, améliore la qualité des données et évite des erreurs coûteuses.
Derrière sa simplicité apparente, le champ Char possède des comportements et options (longueur, indexation, traduction, calcul, etc.) qui influencent l’ergonomie et la performance. Ce guide explique ce que ce champ stocke, comment il s’affiche, comment le créer et l’adapter, et illustre des usages concrets en entreprise.
Qu’est-ce que le champ Char dans Odoo
Dans l’ORM d’Odoo, le champ Char sert à conserver de courtes chaînes de caractères. Selon que vous fixiez une taille maximale ou non, la colonne correspondante en base sera typiquement en VARCHAR(n) ou TEXT sous PostgreSQL.
Pour l’utilisateur, un Char s’affiche comme un champ texte sur une seule ligne dans un formulaire, et comme une cellule de texte dans les vues liste. C’est le choix par défaut pour les noms, codes, références et autres identifiants succincts qui tiennent sur une ligne.
Exemple d’usage fréquent en code et en configuration (définition dans un modèle Python).
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
customer_po_reference = fields.Char(
string='Customer PO Reference',
size=64,
index=True,
)
Le paramètre string indique l’étiquette affichée à l’écran. size (optionnel) impose un maximum de caractères. index crée un index en base pour accélérer les recherches sur ce champ.
Dans Odoo Studio, l’équivalent se présente comme un champ « Text (ligne unique) ». Studio préfixe automatiquement le nom technique par x_studio_, alors qu’en code vous choisissez librement le nom x_* dans vos modules.
Comment fonctionne ce champ
Lorsqu’un champ Char est défini dans un module, Odoo gère automatiquement la création ou la modification de la colonne en base lors de l’installation ou de la mise à jour du module — pas besoin d’écrire des migrations SQL manuelles pour la plupart des cas.
Techniquement, sans size la colonne devient TEXT ; avec une taille elle devient VARCHAR(n). PostgreSQL traite bien les deux types ; la principale différence est la contrainte de longueur, pas la performance brute dans la majorité des usages.
Attributs clés du champ
Voici les propriétés les plus utiles du champ Char dans Odoo et à quoi elles servent dans la pratique :
- size : Détermine le nombre maximal de caractères autorisés au niveau base de données. Si omis, pas de limite imposée côté DB.
- translate : Active la traduction par langue pour les champs destinés à varier selon la langue de l’utilisateur (utile sur noms de produits, intitulés, etc.).
- required : Rend le champ obligatoire à la saisie et au niveau du modèle.
- default : Valeur initiale automatiquement assignée aux nouveaux enregistrements.
- index : Crée un index en base pour accélérer les tris et filtres fréquents sur ce champ.
- compute : Assigne une méthode Python pour calculer dynamiquement la valeur (utile pour références dérivées ou concaténées).
- store : Avec
compute, indique si la valeur calculée doit être stockée en base ou recalculée à la volée. - copy : Détermine si la valeur est dupliquée lors d’un « duplicate ». Par défaut à
True.
Affichage dans les vues
En formulaire, un Char s’affiche comme un <input type="text">. En liste, il apparaît en texte simple. Dans les vues de recherche, il supporte nativement les opérateurs « contient », « égale », « commence par » pour construire des filtres pertinents.
Vous pouvez aussi appliquer des widgets pour améliorer l’affichage : le widget email transforme un Char en lien mailto, url en lien cliquable ouvrant un onglet, etc. Les widgets changent l’expérience sans modifier le stockage sous-jacent.
Interaction avec l’ORM Odoo
Pour un développeur, manipuler un champ Char se fait comme tout autre champ : lecture et écriture via l’objet record. L’ORM gère la validation et l’assainissement en fonction de la définition du champ ; il n’y a pas de conversion complexe, ce qui rend le Char simple et fiable pour l’essentiel des usages.
Cas d’usage en entreprise
Le Char au cœur des processus métier
CRM : numéros de référence client
Beaucoup d’entreprises attribuent un code interne aux clients. Un champ Char sur res.partner permet de stocker ce code, le rendre searchable depuis la liste clients et l’afficher sur devis ou factures pour éviter les confusions entre clients aux noms proches.
Ventes : références commandes clients
Les numéros PO fournis par les clients doivent apparaître sur factures et bons de livraison. Le champ natif client_order_ref sur sale.order est un Char qui circule automatiquement, réduisant les échanges pour retrouver une référence manquante.
Stock : références internes de produits
Le champ default_code sur product.template est un Char utilisé par les entrepôts, lecteurs de codes-barres et bons de commande. Maintenir la cohérence de ce champ est souvent une priorité de qualité des données en logistique.
Comptabilité : numéros TVA ou d’enregistrement
Numéros de TVA, identifiants fiscaux et numéros d’immatriculation sont stockés en Char sur les partenaires et s’injectent automatiquement sur les documents comptables quand la configuration est correcte — très utile pour les activités multi-pays.
RH : identifiants employés et badges
Les RH conservent souvent des numéros d’employé, codes de badge ou identifiants provenant de paie externe. Un simple Char sur le modèle employé permet de relier Odoo à d’autres systèmes sans intégration lourde dès le départ.
Créer ou personnaliser un champ Char
Trois méthodes pour ajouter un Char à un modèle Odoo, selon votre contexte technique.
Via Odoo Studio (sans code)
Studio est l’outil low-code intégré pour ajouter rapidement des champs. Procédure type :
- Ouvrez Odoo Studio depuis le menu principal.
- Allez sur le formulaire ciblé.
- Glissez un champ « Text (ligne unique) » depuis la barre latérale vers le formulaire.
- Remplissez l’étiquette, le caractère obligatoire et, si nécessaire, la longueur maximale dans le panneau de propriétés.
- Sauvegardez et fermez Studio.
Studio crée automatiquement le champ avec le préfixe x_studio_ et l’ajoute à la vue — pas de migration DB manuelle à effectuer.
Via Python dans un module personnalisé
Pour des personnalisations maintenables et versionnées, définissez le champ dans vos fichiers Python de module :
from odoo import fields, models
class ResPartner(models.Model):
_inherit = 'res.partner'
x_erp_customer_id = fields.Char(
string='ERP Customer ID',
size=32,
index=True,
copy=False,
)
Après déclaration, ajoutez le champ dans la vue XML concernée pour qu’il soit visible. Odoo crée la colonne en base à l’installation ou à la mise à jour du module.
Via l’API XML-RPC
Si vous automatisez la configuration depuis l’extérieur (scripts de déploiement, configuration distante), vous pouvez créer des champs via l’API XML-RPC :
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_custom_reference',
'field_description': 'Custom Reference',
'model_id': model_id,
'ttype': 'char',
'size': 64,
'state': 'manual',
}]
)
Le paramètre state: 'manual' indique qu’il s’agit d’un champ créé manuellement (Studio ou API) plutôt que par un module — important pour la gestion et le maintien des champs. C’est une méthode pratique pour des configurations automatisées à distance.
Bonnes pratiques
1. Fixez une taille quand un maximum est connu
Pour des valeurs de longueur fixe (codes pays ISO, numéros avec format déterminé), définissez size. Cela documente l’intention et évite qu’un utilisateur colle un texte démesuré dans un champ où la longueur compte.
2. Indexez les champs filtrés fréquemment
Si un champ sert souvent dans les filtres ou tris (codes clients, références), mettez index=True. Sur des tables volumineuses, l’index peut transformer une recherche lente en une opération réactive pour l’utilisateur.
3. Activez la traduction pour le contenu multilingue
Si votre instance sert des utilisateurs de langues différentes et que le champ doit varier selon la langue (noms, titres, libellés), cochez translate=True pour un affichage adapté à chaque utilisateur.
4. Donnez des noms techniques clairs
Nommez vos champs de manière descriptive (x_customer_erp_id plutôt que x_field1). Les noms techniques sont difficiles à changer une fois des données en place et facilitent la maintenance et la relecture du code.
5. Utilisez compute pour des références dérivées
Les Char peuvent être calculés (concaténation d’année + numéro, par ex.). Avec store=True vous conservez la valeur en base pour la recherche et les rapports, tout en centralisant la logique de génération dans une méthode Python.
Pièges fréquents
Laisser la taille libre ouvre la porte aux mauvaises données
Sans contrainte de longueur, on voit souvent des utilisateurs coller des paragraphes dans des champs de référence — problématique quand ces valeurs sont exportées ou imprimées vers des systèmes qui limitent la longueur. Prévoyez une taille raisonnable lorsque la longueur compte.
Absence d’index sur des champs recherchés
Sans index, un filtre sur un grand tableau provoque un scan complet de la table — et des recherches lentes qui n’apparaissent qu’avec la volumétrie. Si un champ est utilisé régulièrement dans les recherches, indexez-le dès le départ.
Confondre Char et Text
Char = texte court, ligne unique. Text = contenu long, multi-lignes. Utiliser Char pour des adresses ou descriptions longues nuit à l’expérience (pas de retour à la ligne, saisie peu pratique). Si le contenu peut faire plusieurs phrases, préférez Text.
Oublier la traduction sur les champs multilingues
Ne pas activer translate=True pour des champs visibles par des publics de langues différentes signifie que tous verront la même valeur — source de confusion sur les documents clients. Pensez à la localisation dès la conception.
Utiliser Char pour ce qui devrait être une Selection ou une relation
Si le champ ne prend que quelques valeurs possibles (catégorie, statut, pays), mieux vaut utiliser Selection ou Many2one. Les champs Char libres favorisent les erreurs typographiques et les incohérences qui compliquent les rapports et les regroupements.
FAQ
Quelle est la différence entre Char et Text dans Odoo ?
Char sert au texte court sur une seule ligne (noms, codes, références). Text stocke du contenu multi-lignes et s’affiche comme une zone de texte redimensionnable (descriptions, notes). Choisissez selon la longueur et l’usage prévu.
Peut-on limiter le nombre de caractères d’un champ Char ?
Oui : en Python utilisez fields.Char(size=64). Dans Studio, réglez la limite dans les propriétés du champ. Sans taille spécifiée, il n’y a pas de limite imposée côté base de données.
Comment faire apparaître un Char dans la barre de recherche ?
Ajoutez-le à la vue search du modèle. Dans Studio, activez l’option recherche dans les propriétés du champ. En XML, insérez <field name="your_char_field"/> dans la balise <search>. Les utilisateurs pourront alors filtrer directement par ce champ.
Peut-on stocker des nombres dans un Char ?
Techniquement oui, mais déconseillé pour des valeurs numériques à calculer ou comparer. Utilisez Integer/Float pour quantités et montants. Char reste adapté aux identifiants numériques traités comme du texte (codes postaux, numéros de série, IBAN, téléphones).
Comment créer un Char calculé et stocké en base ?
Déclarez le champ avec compute='_compute_my_field' et store=True, puis implémentez la méthode de calcul avec @api.depends() sur les champs déclencheurs. Avec store=True, la valeur persiste en base et sert dans les recherches et exports sans recalculer à chaque lecture.
Conclusion
Le champ Char paraît évident, mais il structure une grande partie du modèle de données d’Odoo. Penser à sa configuration (taille, index, traduction, type de champ) améliore l’expérience utilisateur et la fiabilité des rapports.
Que vous ajoutiez un champ via Studio, que vous le déclariez dans un module Python ou que vous le créiez via l’API, les principes exposés ici vous aideront à le définir correctement dès le départ et à éviter des retours en arrière coûteux.
Un modèle de données bien pensé, avec des types de champs adaptés, est une des clés d’une implémentation Odoo réussie. Le champ Char est un petit maillon de ce système, mais important à maîtriser pour la qualité globale.
Chez Dasolo, nous accompagnons les entreprises pour implémenter, personnaliser et optimiser Odoo dans tous les services. Que vous souhaitiez clarifier votre modèle de données, ajouter des champs sur-mesure ou développer un module complet, nous vous accompagnons. Contactez-nous pour discuter de votre projet Odoo et trouver la solution qui vous correspond.