Dans Odoo, les champs en lecture seule ressemblent à une fonctionnalité simple, mais ils structurent en réalité la façon dont les utilisateurs travaillent et dont les données restent fiables.
Que vous soyez un utilisateur qui s’étonne de voir des zones grisées ou un développeur qui veut maîtriser le comportement des champs, ce guide vous donne les repères essentiels.
Maîtriser les champs en lecture seule, c’est rendre vos processus robustes : préserver l’intégrité des données et éviter des erreurs humaines coûteuses.
Ce tutoriel couvre à la fois le point de vue métier et le point de vue technique — configuration via l’interface ou développement — pour que vous sachiez où intervenir selon votre rôle.
Qu’est-ce qu’un champ en lecture seule dans Odoo ?
Un champ en lecture seule affiche une valeur mais ne permet pas sa modification depuis l’interface : l’utilisateur voit l’information, mais ne peut pas la saisir ou la changer directement.
Dans une fiche, ces champs apparaissent généralement comme du texte fixe plutôt que comme des zones de saisie : visuellement, ils sont souvent plats ou atténués par rapport aux champs modifiables.
Dans Odoo, on peut rendre un champ en lecture seule à deux niveaux distincts :
- Au niveau du modèle (Python/ORM) : le champ est verrouillé partout, quelle que soit la vue
- Au niveau de la vue (XML) : le champ est verrouillé seulement dans la vue ou dans les conditions définies
Cette distinction a de l’importance : un verrouillage au niveau ORM empêche toute écriture depuis l’interface, tandis qu’un verrouillage au niveau vue ne protège que ce contexte précis — d’autres vues ou scripts peuvent toujours modifier la donnée.
Lecture seule n’est pas un type de champ : c’est un attribut applicable à tous les types Odoo (Char, Integer, Float, Many2one, Date, etc.), utilisé pour piloter le comportement à l’exécution.
Comment fonctionne un champ en lecture seule
Pour comprendre le comportement, il faut regarder à la fois le modèle (Python/ORM) et la couche vue (XML).
Lecture seule au niveau ORM
Dans l’ORM Odoo, on peut déclarer un champ comme définitivement en lecture seule dans la définition Python — c’est fréquent pour les champs calculés dont la valeur est dérivée d’autres données (paramètre readonly=True).
Ce verrouillage fait partie de l’API champs en Python et s’applique globalement, quelle que soit la vue utilisée.
Lecture seule basée sur l’état
Un schéma courant consiste à rendre un champ non modifiable selon l’état du document : par exemple, une fois qu’un document quitte l’état brouillon, certains champs se figent pour préserver l’historique.
Les versions récentes d’Odoo simplifient la syntaxe des conditions directement dans la vue XML, alors que les versions plus anciennes utilisaient des règles attrs plus verbeuses.
Quel que soit le style, l’objectif est le même : champ modifiable en brouillon, puis verrouillé lorsque le document progresse dans le workflow — un principe central pour gérer la cohérence des données.
Champs calculés et lecture seule
Par défaut, un champ calculé (défini avec compute) est en lecture seule : sa valeur est générée automatiquement et ne doit pas être saisie manuellement.
Si vous voulez stocker ce calcul en base pour optimiser les recherches et les tris, vous activez store=True, ce qui permet d’utiliser ces colonnes comme des champs classiques au niveau performance.
Rendre un champ calculé modifiable
Pour autoriser la saisie manuelle sur un champ calculé, il faut définir une méthode inverse ; celle-ci explique comment répercuter la valeur saisie. Sans inverse, le champ reste non modifiable.
Cas d’usage en entreprise
Les champs en lecture seule interviennent dans quasiment tous les modules Odoo. Voici des exemples concrets tirés du quotidien des entreprises.
1. CRM : figer les opportunités gagnées ou perdues
Dans la gestion commerciale, le montant prévu et la date de clôture sont modifiables tant que l’opportunité est en cours. Une fois déclarée gagnée ou perdue, ces valeurs sont bloquées pour garder un historique fidèle.
Cela évite que des chiffres soient retouchés a posteriori et faussent les rapports commerciaux.
2. Ventes : protéger les lignes de commande confirmées
Quand une commande passe de Brouillon à Confirmée, les lignes (produit, quantité, prix) deviennent non modifiables pour éviter des divergences après envoi de la confirmation client.
Si une correction est nécessaire, la procédure consiste à repasser la commande en brouillon ou créer un avoir, ce qui laisse une trace claire dans le journal.
3. Stocks : verrouiller les quantités validées
En logistique, dès qu’un transfert est validé, les quantités effectuées sont bloquées pour garantir la cohérence de l’inventaire et de la valorisation.
Pouvoir modifier ces quantités après validation risquerait d’induire des erreurs d’inventaire réparties sur plusieurs emplacements.
4. Comptabilité : lignes d’écritures postées
En comptabilité, une écriture comptable postée ne doit plus être modifiée : c’est souvent une obligation légale et un principe fondamental de la comptabilité en partie double.
Modifier après publication mettrait en péril la fiabilité des états financiers et la conformité réglementaire.
5. Fabrication : données des ordres de travail terminés
En production, une fois un ordre de travail finalisé, la durée réelle et les quantités produites sont verrouillées afin d’alimenter correctement le calcul des coûts et les indicateurs de performance.
Créer ou personnaliser un champ en lecture seule
Deux méthodes principales permettent d’appliquer la lecture seule : Odoo Studio pour une approche sans code, ou le couple Python/XML pour un contrôle technique complet.
Utiliser Odoo Studio
Odoo Studio permet d’ajouter ou de modifier l’attribut lecture seule sans coder, idéal pour les administrateurs et consultants.
- Ouvrez Odoo Studio depuis le menu principal (icône crayon)
- Accédez à la vue formulaire à modifier
- Sélectionnez le champ concerné
- Dans le panneau de propriétés à droite, activez l’option "Lecture seule"
- Enregistrez et quittez Studio
Studio propose aussi des règles conditionnelles : vous pouvez rendre un champ lecture seule uniquement quand un statut a une valeur donnée, sans écrire de code.
Cette méthode est rapide et sûre pour déployer des règles métier ; les modifications restent stockées en base et tiennent lors des mises à jour de modules.
Personnalisation technique en Python
Pour les développeurs, l’attribut readonly se définit dans la définition du champ en Python. C’est l’usage standard dans les modules personnalisés.
Vous pouvez mettre readonly=True pour un verrou statique, ou utiliser states pour préciser dans quels états le champ est modifiable ou non.
Cette approche est pratique lorsqu’on ajoute des champs personnalisés à des modèles existants dans le cadre d’un projet d’adaptation Odoo.
Attributs de vue en XML
Pour verrouiller à l’échelle d’une vue, on ajoute l’attribut readonly sur l’élément champ dans le XML de la vue.
L’avantage est la flexibilité : le même champ peut rester éditable dans une vue et figé dans une autre, sans toucher à la définition Python.
Odoo 17 propose une syntaxe d’expression inline plus lisible pour les conditions readonly, mais les deux méthodes (ancienne attrs et nouvelle) restent valables selon la version utilisée.
Bonnes pratiques
Bien utiliser la lecture seule, c’est l’appliquer au bon endroit et pour la bonne raison. Voici des recommandations issues de l’expérience des consultants Odoo.
1. Privilégiez le niveau vue quand le contexte varie
Si le champ doit être verrouillé uniquement selon l’état du document ou la vue, faites-le au niveau XML pour garder la flexibilité du modèle et permettre aux traitements back-end de modifier la valeur si nécessaire.
2. Alignez les conditions sur le cycle de vie du document
Les verrous doivent suivre la logique métier : verrouiller au moment où toute modification deviendrait problématique évite des comportements inattendus pour l’utilisateur.
3. Testez selon les profils utilisateurs
Les droits et profils peuvent modifier la perception d’un champ : vérifiez le comportement en tant qu’utilisateur standard et en tant qu’administrateur afin d’anticiper les écarts.
4. Combinez lecture seule et obligatoire quand pertinent
Dans les formulaires multi-étapes, un champ peut être requis en brouillon puis devenir lecture seule après confirmation : faites apparaître ces règles clairement dans la vue.
5. Documentez la logique derrière le verrouillage
Ajoutez toujours un commentaire expliquant le pourquoi d’un champ readonly dans votre code : cela aide fortement les mainteneurs futurs à comprendre la raison métier et à éviter des changements intempestifs.
6. Utilisez Studio pour des changements rapides et sûrs
Pour des cas simples, Studio reste la solution la plus rapide et la plus sûre face aux évolutions d’Odoo ; réservez les personnalisations Python aux besoins complexes.
Pièges fréquents
Même les utilisateurs expérimentés se font piéger par certains comportements liés à la lecture seule. Voici les problèmes récurrents à surveiller.
Confondre restriction d’interface et sécurité réelle
Un champ rendu readonly dans une vue n’empêche pas une écriture via l’API, des appels ORM en Python ou des actions serveur : c’est une contrainte d’UI, pas une règle de sécurité. Pour bloquer toute écriture, utilisez le niveau ORM ou des règles d’accès adaptées.
Verrouiller définitivement alors qu’une condition serait suffisante
Bloquer un champ au niveau modèle empêche toute modification, y compris lors de corrections légitimes (ex. repasser en brouillon). Réfléchissez au cycle complet avant d’imposer un readonly permanent.
Oublier les méthodes onchange
Un onchange peut tenter d’écrire sur un champ readonly, provoquant des comportements confus (valeurs qui semblent changer puis se réinitialisent ou des erreurs). Adaptez vos onchanges pour tenir compte des champs figés.
Ne pas appliquer la lecture seule sur toutes les vues
Un champ readonly dans le formulaire peut rester éditable en liste ou en kanban si ces vues n’ont pas la même règle ; vérifiez chaque affichage où le champ apparaît.
Effets secondaires lors de l’héritage de modèles standards
Ajouter readonly=True à un champ d’un modèle standard affecte toutes les vues qui l’utilisent, y compris celles d’Odoo. Assurez-vous que ce changement est voulu et qu’il ne casse pas d’autres personnalisations.
Conclusion
Les champs en lecture seule sont un levier essentiel pour guider les utilisateurs, protéger les données et faire respecter les règles métier sans devoir compter uniquement sur la formation.
Le point clé est de choisir le bon niveau d’application (vue ou modèle) et d’aligner les conditions avec la manière dont vos équipes travaillent réellement.
Que vous passiez par Odoo Studio pour une approche sans code ou par Python/XML pour un projet technique, la logique reste la même : afficher les données tout en empêchant les modifications involontaires.
Peu visibles dans les discussions techniques, les champs readonly ont pourtant un impact durable sur la qualité des processus.
Chez Dasolo, nous accompagnons les entreprises dans l’implémentation, la personnalisation et l’optimisation d’Odoo, module par module, secteur par secteur. Si vous voulez sécuriser vos champs, fiabiliser vos workflows ou revoir votre modèle de données, nous pouvons vous aider. Contactez‑nous et parlez‑nous de votre projet.