Si vous avez bidouillé l'ORM d'Odoo ou retouché des vues, le terme contexte vous a sûrement sauté aux yeux. Il apparaît un peu partout — définitions de champs, attributs XML de vues, méthodes Python — et pour beaucoup il reste une boîte noire : tout va bien jusqu'au jour où un comportement surprenant surgit.
Saisir le rôle du contexte n’est pas seulement théorique : c’est ce qui influence les valeurs par défaut des formulaires, le filtrage des recherches, le rendu des champs calculés et, au final, la productivité des utilisateurs. Que vous fassiez une petite personnalisation Odoo ou développiez un module complet, maîtriser le contexte évite des heures de débogage.
Ce guide reprend l’essentiel : qu’est-ce que le contexte, comment il circule dans le framework Odoo et comment l’utiliser sans crainte dans vos projets.
Qu'est-ce que le contexte dans Odoo
Dans Odoo, le contexte est simplement un dictionnaire Python qui accompagne chaque appel, requête et opération sur les enregistrements. Ce n’est pas un type de champ au sens ORM — vous ne trouverez pas de fields.Context() — mais plutôt un mécanisme qui modifie le comportement à l’exécution.
Imaginez-le comme un petit carnet d’indications envoyé avec la requête : « pré-remplir ce champ », « inclure les éléments archivés », « calculer en utilisant cette langue », ou « appliquer ce filtre pour la liste liée ». Ces indications guident Odoo sans toucher au modèle lui-même.
Où le contexte apparaît
On retrouve le contexte à trois niveaux principaux dans le modèle de données Odoo :
- Sur les définitions de champs en Python : un paramètre
contextque l’on peut passer aux champs relationnels (Many2one, One2many, Many2many). - Dans les attributs XML des vues : l’attribut
contextdes balises<field>dans les vues form, tree, kanban, etc. - Dans l’environnement ORM : accessible via
self.env.contexten Python, et modifiable de façon non destructive avecself.with_context(...).
Dans ces trois endroits, le principe est identique : transporter des informations additionnelles qui influencent le comportement d’un champ ou d’un enregistrement à l’exécution.
Comment le contexte s'intègre au modèle de données Odoo
Le contexte circule tout au long du cycle de vie d’une requête — de l’ouverture d’un formulaire jusqu’à l’enregistrement. Voici les mécanismes concrets à connaître.
Valeurs par défaut via default_*
Un usage très courant consiste à passer des clés commençant par default_. Lorsqu’une clé de ce type est présente, Odoo l’utilise pour pré-remplir le champ correspondant lors de la création d’un nouvel enregistrement.
Par exemple, si une action ouvre un bon de vente avec {"default_partner_id": 42} dans le contexte, le client sera déjà sélectionné avec l’ID 42 à l’ouverture du formulaire. Résultat : formulaire pré-rempli sans logique Python supplémentaire.
Ce pattern est largement utilisé en développement Odoo pour orchestrer des parcours utilisateurs fluides entre écrans.
Le paramètre context sur les champs relationnels
Lorsque vous déclarez un Many2one, One2many ou Many2many en Python, vous pouvez fournir un context. Ce contexte s’applique quand le champ charge des enregistrements ou en crée via son pop-up ou son sélecteur.
Par exemple, un Many2one vers res.partner avec context={"default_is_company": True} fera en sorte que, si l’utilisateur crée un nouveau partenaire depuis ce champ, la case « Est une société » soit cochée par défaut. Vous orientez l’utilisateur sans imposer la valeur.
Contexte dans les vues XML
En XML de vue, l’attribut context sur une balise de champ fonctionne de la même manière mais peut être dynamique : on peut référencer d’autres champs via la syntaxe d’évaluation d’Odoo.
Cela permet de concevoir des formulaires intelligents où le contexte d’un champ dépend d’un autre champ — une technique clé des personnalisations Odoo pour éviter d’écrire du Python quand ce n’est pas nécessaire.
Lire et modifier le contexte en Python
Dans n’importe quelle méthode de modèle, le contexte courant se lit via self.env.context. Vous obtenez alors le dictionnaire tel qu’il était lors de l’appel.
Pour exécuter du code avec un contexte modifié, utilisez self.with_context(key=value). Cela renvoie un nouveau recordset portant le contexte modifié, sans toucher à l’environnement d’origine — une approche propre et non destructive qui colle bien au style fonctionnel d’Odoo.
Clés contextuelles intégrées courantes
Odoo définit plusieurs clés de contexte reconnues qui déclenchent des comportements spécifiques dans le framework :
lang: force l’affichage dans une langue donnée pour les champs traduits.active_test: passer àFalsepour inclure les enregistrements archivés lors d’un search.no_recompute: empêche le recalcul des champs stockés.mail_notrack: désactive la traçabilité dans le chatter pour une opération d’écriture.allowed_company_ids: contrôle la visibilité en environnement multi-entreprises.bin_size: demande la taille au lieu du contenu pour les champs Binary.
Connaître ces clés fait partie des bonnes pratiques pour tout développeur Odoo, car elles permettent d’ajuster le comportement sans ajouter de code spécifique.
Cas pratiques en entreprise
Le contexte n’est pas réservé aux développeurs : il résout des besoins métiers concrets. Voici cinq cas d’usage fréquents dans des implémentations Odoo.
1. CRM : pré-affecter l’équipe commerciale sur les nouveaux leads
Une responsable commerciale travaille dans un kanban filtré sur son équipe. Quand elle clique sur « Nouveau », elle s’attend à ce que le lead soit attribué à son équipe. En passant default_team_id dans le contexte de l’action, le formulaire s’ouvre déjà avec l’équipe sélectionnée — plus d’erreurs d’affectation.
2. Ventes : définir le tarif selon le segment client
Depuis une vue filtrée par catégorie de clients, le commercial peut générer un devis avec le champ pricelist pré-rempli via default_pricelist_id. Le contexte guide le commercial vers le bon tarif tout en lui laissant la liberté de modifier si besoin.
3. Stock : restreindre les emplacements dans les transferts
En logistique, le champ « emplacement source » d’un transfert peut être restreint via contexte pour n’afficher que les emplacements d’un entrepôt donné. On passe un domaine dans le contexte du champ Many2one pour simplifier l’interface et limiter les erreurs dans les environnements multi-entrepôts.
4. Comptabilité : lignes de facture multilingues
Lors de l’émission d’une facture internationale, la clé de contexte lang force l’affichage des descriptions dans la langue du client. Une facture adressée à un client français montrera noms et descriptions produits en français, même si la base interne est en anglais.
5. Modèles personnalisés : afficher les produits archivés dans une vue spécifique
Une équipe opérationnelle doit consulter les produits discontinués avec les actifs. Une action personnalisée peut mettre active_test: False dans son contexte pour cette vue précisе, affichant ainsi les produits archivés sans modifier le comportement global du reste de l’interface.
Créer et adapter le contexte sur des champs
Deux approches permettent d’ajouter ou modifier du contexte sur des champs : sans code via Odoo Studio, ou avec Python et XML pour un contrôle total — un point souvent abordé dans tout tutoriel technique Odoo sur le comportement des champs.
Utiliser Odoo Studio
Odoo Studio propose des options pour ajuster certains aspects d’un champ sans coder. Pour les champs relationnels, Studio expose une configuration de contexte où l’on peut définir des valeurs par défaut qui s’appliqueront à la création d’un enregistrement depuis ce champ.
C’est pratique pour des cas simples : pré-remplir une société, une équipe, une catégorie ou un responsable. En revanche, Studio simplifie volontairement le contexte : pour un contexte dynamique dépendant d’autres champs, il faudra passer par la voie technique.
Notez aussi que le contexte défini par Studio est stocké dans la vue. Si vous créez ensuite une personnalisation technique sur cette même vue, prenez en compte le contexte généré par Studio pour éviter des conflits.
Définir le contexte sur les champs en Python
Dans un module personnalisé, on ajoute le contexte directement dans la définition du champ. Pour un Many2one, le paramètre context accepte un dictionnaire statique :
Ce contexte statique s’applique à chaque chargement ou création via le champ et n’évolue pas selon l’état de l’enregistrement. Si vous avez besoin d’un contexte qui réagit à la fiche courante, la logique doit être placée au niveau de la vue.
Définir le contexte dans les vues XML
Dans XML, l’attribut context prend une chaîne évaluée à l’exécution. Vous pouvez y référencer des valeurs de champs, l’ID de l’utilisateur (uid), l’ID actif (active_id) et d’autres variables.
Cela rend le contexte de vue beaucoup plus flexible que le contexte défini sur le champ. C’est la manière recommandée dans le framework Odoo pour concevoir des formulaires où le comportement d’un champ dépend d’un autre, et comment on « crée des comportements de champs Odoo » qui paraissent naturels aux utilisateurs.
Passer le contexte via les actions de fenêtre
Le contexte peut aussi être fixé sur des enregistrements ir.actions.act_window. C’est ainsi que menus et boutons transmettent un contexte aux vues qu’ils ouvrent : le dictionnaire de l’action est fusionné dans le contexte de session à l’ouverture.
C’est la méthode idéale pour des cas comme l’exemple CRM cité plus haut : le contexte vit sur l’action, pas sur le champ, ce qui permet d’avoir des valeurs par défaut différentes selon le chemin de navigation sans toucher au code du modèle.
Bonnes pratiques
Quelques habitudes simples rendent le travail avec le contexte beaucoup plus sûr, que vous développiez un module ou fassiez une personnalisation Odoo rapide.
- Utilisez le contexte pour suggérer, pas pour imposer. Les valeurs par défaut via contexte orientent l’utilisateur sans le bloquer. Si vous devez contraindre, préférez un domain ou une méthode onchange.
- Placez le contexte dynamique dans les vues, pas dans la définition des champs. Le contexte de champ est statique ; pour qu’il reflète l’état courant de la fiche, c’est en XML qu’il faut le gérer.
- Privilégiez
with_context()plutôt que de modifierenv.contextdirectement. L’environnement Odoo est pensé comme immuable durant un appel — créer un nouvel environnement évite des effets de bord. - Soyez sélectif sur ce que vous mettez dans le contexte. Les clés s’accumulent en remontant la pile d’appels : des clés inutiles peuvent provoquer des comportements inattendus ailleurs.
- Passez des flags via le contexte pour la logique conditionnelle. Par exemple,
from_wizard: Truedans le contexte permet à un compute ou un onchange d’adapter son comportement sans ajouter d’état métier dans le modèle. - Documentez les clés de contexte personnalisées dans votre module. Elles sont invisibles à première vue ; un commentaire ou une docstring expliquant les clés lues ou définies évite des incompréhensions ultérieures.
Pièges fréquents
Les bugs liés au contexte sont souvent sournois car le contexte n’est pas visible dans l’interface. Voici les erreurs les plus courantes rencontrées en projet.
Prendre default_* pour des valeurs obligatoires
Une valeur par défaut passée via le contexte s’applique quand l’utilisateur crée un enregistrement depuis un formulaire. Si vous créez des enregistrements par code sans fournir le contexte, la valeur par défaut ne sera pas appliquée. Certains développeurs confondent ces defaults contextuels avec les default définis au niveau champ — ce n’est pas la même chose. Si la valeur est importante lors d’une création via ORM, transmettez explicitement le contexte en code.
Modifier le dictionnaire de contexte directement
Le dictionnaire de contexte est partagé durant l’exécution. Altérer self.env.context en place peut impacter d’autres routines dans la même transaction. La bonne pratique est d’utiliser self.with_context(new_key=value) pour obtenir un nouvel environnement contenant une copie du contexte plus vos modifications.
Mettre trop d’informations dans le contexte
Chaque clé ajoutée circule dans toute la chaîne d’appels. Certaines méthodes Odoo réagissent à des clés spécifiques ; des clés inattendues peuvent donc activer des comportements non prévus. Gardez le contexte minimal et ciblé pour l’opération en cours.
Oublier active_test pour rechercher les archivés
Par défaut, search() et search_read() excluent les enregistrements archivés (active = False). Si votre code doit manipuler des archivés, vous devez explicitement passer active_test: False dans le contexte. Oublier cela revient fréquemment comme source d’erreurs en gestion de produits et stocks.
Conflits de contexte entre Studio et code personnalisé
Si Odoo Studio a défini un contexte sur un champ et que vous ajoutez ensuite une extension technique ciblant la même vue, les deux contextes peuvent entrer en conflit ou en écraser un selon l’ordre de fusion XML. Inspectez toujours le contexte existant avant d’appliquer votre propre contexte via héritage de vue — c’est un point chaud quand on mélange champs Studio et customisations modules.
Conclusion
Le contexte est un mécanisme discret mais puissant d’Odoo. Une fois que vous comprenez comment il circule entre définitions de champs, attributs de vue et environnement ORM, vous gagnez une maîtrise fine du comportement des données.
Les idées clés sont simples : utilisez les default_* pour guider sans contraindre ; mettez le contexte dynamique en XML plutôt qu’en définition de champ ; préférez with_context() à la mutation directe ; et gardez le contexte succinct pour éviter d’impacter d’autres parties du système.
Que vous suiviez un tutoriel sur les champs Odoo, développiez un module personnalisé ou résolviez un comportement étrange, comprendre le contexte fait toujours partie de la solution.
Chez Dasolo, nous accompagnons des entreprises dans l’implémentation, la personnalisation et l’optimisation d’Odoo pour coller aux processus réels. Si votre personnalisation implique du contexte et que vous doutez de son usage, ou simplement si vous voulez discuter de votre projet Odoo, nous sommes là pour vous aider.
Contactez notre équipe via la page de contact et dites-nous ce que vous souhaitez construire. Nous aidons des organisations de toutes tailles à faire fonctionner Odoo comme il le devrait.