Se rendre au contenu

Champs de contexte dans Odoo : Un guide pratique

Comprendre comment le contexte façonne le comportement des champs, les valeurs par défaut et le filtrage des enregistrements dans l'ORM Odoo.
6 mars 2026 par
Champs de contexte dans Odoo : Un guide pratique
Dasolo
| Aucun commentaire pour l'instant

Si vous avez passé du temps à travailler avec l'ORM Odoo ou à personnaliser des vues, vous avez presque certainement vu le mot contexte apparaître. Il apparaît dans les définitions de champs, dans les attributs de vue XML, et tout au long du code Python d'Odoo. Pourtant, pour de nombreux développeurs et consultants, cela reste l'une de ces choses qui fonctionnent jusqu'à ce qu'elles ne fonctionnent plus.


Comprendre les champs de contexte dans Odoo n'est pas seulement un exercice académique. Cela affecte directement le comportement de votre modèle de données, comment les formulaires pré-remplissent les valeurs, comment les enregistrements sont filtrés, et comment les champs calculés décident quoi retourner. Que vous fassiez une simple personnalisation Odoo ou que vous construisiez un module complet, bien gérer le contexte vous fait gagner beaucoup de temps de débogage.


Ce guide décompose ce qu'est le contexte, comment il circule à travers le framework Odoo, et comment l'utiliser avec confiance dans des projets réels.

Qu'est-ce que le contexte dans Odoo


Le contexte dans Odoo est un dictionnaire Python qui voyage avec chaque requête, chaque appel de méthode, et chaque opération d'enregistrement. Ce n'est pas un type de champ au sens traditionnel. Vous ne trouverez pas fields.Context() dans l'ORM Odoo. Au lieu de cela, le contexte est un mécanisme qui modifie le comportement des champs.


Considérez-le comme un ensemble d'instructions invisibles transmises avec vos données. Ces instructions disent à Odoo des choses comme : pré-remplir ce champ avec une valeur par défaut, montrer également les enregistrements archivés, calculer ce champ en utilisant une langue différente, ou appliquer ce domaine lors de l'affichage du sélecteur d'enregistrements associés.


Où apparaît le contexte

Vous rencontrerez le contexte à trois endroits principaux dans le modèle de données Odoo :

  • Dans les définitions de champs en Python : Le paramètre context sur les champs relationnels comme Many2one, One2many et Many2many.
  • Dans les attributs de vue XML : L'attribut context sur les balises <field> dans les vues de formulaire, de liste et de kanban.
  • Dans l'environnement ORM : Accessible via self.env.context dans le code Python, et modifiable avec self.with_context(key=value).

Dans les trois cas, le contexte fait la même chose fondamentale : il transporte des informations supplémentaires qui façonnent le comportement d'un champ ou d'un enregistrement à l'exécution.

Comment le contexte fonctionne dans le modèle de données Odoo


Le contexte circule à travers le cycle de vie de la requête Odoo depuis le moment où un utilisateur ouvre un formulaire jusqu'au moment où un enregistrement est sauvegardé. Voici comment les mécanismes clés fonctionnent en pratique.


Valeurs par défaut avec default_*

Un des modèles de contexte les plus couramment utilisés est default_field_name. Lorsque vous passez une clé commençant par default_, Odoo l'utilise pour pré-remplir un champ lors de la création d'un nouvel enregistrement.

Par exemple, si un bouton ouvre un nouveau formulaire de commande de vente et passe {"default_partner_id": 42} dans le contexte, le champ client sera déjà défini sur le partenaire avec l'ID 42. L'utilisateur voit un formulaire pré-rempli sans aucune logique Python supplémentaire requise.


Ce modèle est largement utilisé dans le développement Odoo pour créer des flux de navigation intelligents entre les enregistrements.


L'attribut contexte sur les champs relationnels

Lorsque vous définissez un champ Many2one, One2many ou Many2many en Python, vous pouvez passer un paramètre context. Ce contexte est appliqué chaque fois que le champ relationnel charge ou crée des enregistrements via son popup ou son menu déroulant.


Un exemple pratique : un Many2one pointant vers res.partner avec context={"default_is_company": True} signifie que si l'utilisateur crée un nouveau partenaire directement à partir de ce champ, la case à cocher Est une entreprise sera pré-cochée. Vous incitez l'utilisateur à saisir les bonnes données sans l'imposer.


Contexte dans les vues XML

Dans le XML de la vue, l'attribut context sur une balise de champ fonctionne de la même manière, mais il peut être dynamique. Vous pouvez référencer d'autres valeurs de champ en utilisant la syntaxe d'évaluation d'Odoo :


Cela vous permet de créer des formulaires intelligents où le contexte d'un champ dépend de la valeur d'un autre. C'est une technique essentielle dans la personnalisation d'Odoo pour créer des comportements relationnels intelligents sans écrire de code Python supplémentaire.


Lecture et modification du contexte en Python

Dans n'importe quelle méthode de modèle, vous pouvez lire le contexte actuel en utilisant self.env.context. Cela vous donne le dictionnaire complet tel qu'il était lorsque la méthode a été appelée.


Pour exécuter du code avec un contexte modifié, vous utilisez self.with_context(key=value). Cela renvoie un nouvel ensemble d'enregistrements qui porte le contexte mis à jour sans changer l'original. C'est un modèle propre et non destructif qui s'intègre bien au style de programmation fonctionnelle d'Odoo.


Clés de contexte intégrées courantes

Odoo lui-même utilise plusieurs clés de contexte réservées qui déclenchent un comportement spécifique dans le cadre Odoo :


  • lang : Change la langue utilisée pour les valeurs de champ traduites.
  • active_test : Défini sur False pour inclure les enregistrements archivés dans les résultats de recherche.
  • no_recompute: Empêche le recalcul des champs calculés stockés.
  • mail_notrack: Désactive le suivi des discussions pour une opération d'écriture.
  • allowed_company_ids: Contrôle la visibilité des enregistrements multi-entreprises.
  • bin_size: Renvoie les tailles de fichiers au lieu du contenu binaire pour les champs binaires.

Connaître ces clés intégrées fait partie de tout guide de développeur Odoo solide car elles vous permettent de contrôler le comportement sans écrire de code personnalisé.

Cas d'utilisation commerciale


Les champs de contexte ne sont pas seulement un outil pour les développeurs. Ils résolvent de réels problèmes de flux de travail dans différents domaines d'activité. Voici cinq exemples d'implémentations Odoo courantes.


1. CRM : Pré-remplissage de l'équipe de vente sur les nouveaux leads

Un responsable des ventes a une vue kanban filtrée pour son équipe. Lorsqu'elle clique sur "Nouveau", elle s'attend à ce que le lead soit automatiquement attribué à son équipe. En passant default_team_id dans le contexte de l'action, le champ de l'équipe est pré-rempli au moment où le formulaire s'ouvre. Pas de sélection manuelle nécessaire, pas de mauvaises attributions d'équipe.


2. Ventes : Définition par défaut de la liste de prix en fonction du segment client

Lorsqu'un commercial crée un devis à partir d'une vue de catégorie client spécifique, le champ de la liste de prix peut être préconfiguré à l'aide du contexte. Le contexte transporte default_pricelist_id basé sur la catégorie, guidant le commercial vers le bon prix sans restreindre ses choix.


3. Inventaire : Filtrage des emplacements dans les formulaires de transfert

Dans les opérations d'entrepôt, le champ d'emplacement source d'un formulaire de transfert peut utiliser le contexte pour restreindre le menu déroulant uniquement aux emplacements appartenant à un entrepôt spécifique. Cela se fait en passant un domaine via le contexte sur le champ Many2one, gardant l'interface propre et réduisant les erreurs dans les configurations multi-entrepôts.


4. Comptabilité : Lignes de Facture Multilingues

Lors de la génération de factures pour des clients internationaux, la clé de contexte lang force les descriptions traduites à apparaître dans la langue du client. Une facture envoyée à un client français affichera les noms et descriptions des produits en français, même si la base de données interne stocke tout en anglais.


5. Modèles Personnalisés : Afficher les Produits Archivés dans une Vue Spéciale

Une équipe opérationnelle doit examiner les produits discontinués aux côtés des produits actifs. Une vue de liste personnalisée passe active_test: False dans son contexte d'action. Sans changer de code Python, tous les produits, y compris les archivés, apparaissent dans cette vue spécifique, tandis que le reste de l'interface reste inchangé.

Créer et personnaliser le contexte sur les champs


Il existe deux voies pour ajouter ou modifier le contexte sur les champs dans Odoo : utiliser Odoo Studio pour des ajustements sans code, ou écrire du Python et de l'XML pour un contrôle technique complet. C'est une partie clé de tout tutoriel technique odoo sur le comportement des champs.


Utiliser Odoo Studio

Odoo Studio vous permet de modifier certaines propriétés de champ sans écrire de code. Pour les champs relationnels, Studio expose une option de configuration de contexte où vous pouvez définir des valeurs par défaut qui seront appliquées lorsqu'un nouvel enregistrement est créé à partir de ce champ.


Ceci est utile pour des cas simples : pré-remplir une entreprise, une équipe, une catégorie ou un utilisateur responsable. La limitation est que le support de contexte de Studio est intentionnellement simplifié. Pour un contexte dynamique qui fait référence à d'autres valeurs de champ, vous devrez opter pour la voie technique.


Lors de l'utilisation des champs odoo studio, gardez à l'esprit que le contexte que vous définissez est stocké directement sur la vue. Si vous créez plus tard une personnalisation technique sur la même vue, vous devez tenir compte du contexte défini par Studio existant pour éviter les conflits.


Définir le Contexte sur les Champs en Python

Dans un module personnalisé, le contexte est ajouté directement à la définition du champ. Pour un champ Many2one, le paramètre context accepte un dictionnaire statique :


Ce contexte statique est appliqué chaque fois que le champ charge ou crée des enregistrements liés. Il ne change pas en fonction des autres valeurs de champ. Pour un contexte qui réagit à l'état de l'enregistrement actuel, vous déplacez la logique au niveau de la vue à la place.


Définir le contexte dans les vues XML

Dans le XML de la vue, l'attribut de contexte accepte une chaîne que Odoo évalue à l'exécution. Vous pouvez référencer les valeurs de champ, l'ID de l'utilisateur actuel (uid), l'ID de l'enregistrement actif (active_id), et d'autres variables :

Cela rend le contexte au niveau de la vue beaucoup plus flexible que le contexte au niveau du champ. C'est l'approche standard dans le framework odoo pour construire des formulaires où le comportement d'un champ dépend d'un autre. C'est aussi ainsi que vous créez des comportements de champs odoo qui semblent natifs et intuitifs pour les utilisateurs finaux.


Passer le contexte via des actions de fenêtre

Le contexte peut également être défini sur les enregistrements ir.actions.act_window. C'est ainsi que les menus et les boutons passent le contexte aux vues qu'ils ouvrent. Le champ context d'une action contient le dictionnaire qui est fusionné dans le contexte de session lorsque la vue se charge.


C'est la manière la plus propre de gérer des cas d'utilisation comme l'exemple de l'équipe de vente CRM ci-dessus. Le contexte vit sur l'action, pas sur la définition du champ, ce qui signifie que vous pouvez avoir des valeurs par défaut différentes dans différents contextes de navigation sans toucher au code du modèle.

Meilleures pratiques


Travailler avec le contexte dans Odoo devient beaucoup plus fluide une fois que vous suivez quelques habitudes cohérentes. Celles-ci s'appliquent que vous construisiez un module ou que vous fassiez une rapide personnalisation odoo.


  • Utilisez le contexte pour des suggestions, pas pour des contraintes. Les valeurs par défaut basées sur le contexte guident les utilisateurs sans les bloquer. Si vous avez besoin d'une contrainte stricte, utilisez un domaine ou une méthode onchange à la place.
  • Mettez le contexte dynamique dans les vues, pas dans les définitions de champ. Le contexte au niveau du champ est statique. Si le contexte doit refléter l'état de l'enregistrement actuel, le XML de la vue est l'endroit approprié.
  • Utilisez with_context() au lieu de modifier env.context directement. L'environnement d'Odoo est conçu pour être immuable dans un appel. Créez toujours un nouvel environnement avec with_context() plutôt que d'essayer de modifier l'existant.
  • Soyez intentionnel sur ce que vous passez dans le contexte. Les clés de contexte s'accumulent au fur et à mesure qu'elles traversent la pile d'appels. Passer des clés inutiles peut entraîner un comportement inattendu dans les méthodes qui vérifient ces clés.
  • Utilisez le contexte pour passer des indicateurs pour une logique conditionnelle. Un modèle courant consiste à passer un indicateur booléen comme from_wizard: True dans le contexte, puis à le vérifier dans une méthode compute ou onchange pour appliquer un comportement différent. Cela évite de polluer les champs du modèle avec l'état du flux de travail.
  • Documentez les clés de contexte personnalisées dans votre module. Les clés de contexte sont invisibles à moins que vous ne sachiez où les chercher. Ajoutez un commentaire ou une docstring expliquant toutes les clés de contexte personnalisées que votre module lit ou définit. Cela porte ses fruits lorsque vous ou un collègue revenez au code plus tard.

Pièges courants


Les bugs liés au contexte peuvent être difficiles à diagnostiquer car le contexte est invisible dans l'interface utilisateur. Ce sont les erreurs qui surviennent le plus souvent dans des projets réels.


Traiter default_* comme des valeurs obligatoires

Une valeur par défaut définie via le contexte n'est appliquée que lorsqu'un enregistrement est créé via un formulaire. Si vous créez des enregistrements par programmation via l'ORM sans passer le contexte pertinent, la valeur par défaut ne sera pas appliquée. Les développeurs s'attendent parfois à ce que les valeurs par défaut du contexte se comportent comme des paramètres default au niveau de Python sur les champs. Ce n'est pas le cas. Passez toujours le contexte explicitement lors de la création d'enregistrements dans le code si ces valeurs par défaut sont importantes.


Modifier directement le dictionnaire de contexte

Le dictionnaire de contexte est partagé à travers la pile d'appels. Si vous modifiez self.env.context directement, vous pouvez affecter d'autres codes exécutés dans la même transaction de manière inattendue. Le bon modèle est toujours self.with_context(new_key=value), qui crée un nouvel environnement avec une copie du contexte plus vos modifications.


Passer trop de choses dans le contexte

Chaque clé que vous ajoutez au contexte traverse toute la chaîne d'appels. Certaines méthodes Odoo vérifient des clés de contexte spécifiques et modifient leur comportement en conséquence. Passer des clés inattendues peut déclencher ces branches par accident. Gardez le contexte léger et spécifique à ce dont l'opération immédiate a besoin.


Oublier active_test lors de la recherche d'enregistrements archivés

Par défaut, les méthodes search() et search_read() d'Odoo filtrent les enregistrements archivés (où active = False). Si votre code doit travailler avec des enregistrements archivés, vous devez explicitement passer active_test: False dans le contexte. Oublier cela est un bug très courant dans les personnalisations de gestion des stocks et des produits.


Conflits de contexte entre Studio et code personnalisé

Si Odoo Studio a défini un contexte sur un champ dans une vue, et que vous ajoutez ensuite une extension de vue technique ciblant le même champ, les deux contextes peuvent entrer en conflit ou l'un peut remplacer l'autre en fonction de l'ordre de fusion XML. Inspectez toujours le contexte existant sur un champ avant d'ajouter le vôtre via une héritage de vue. C'est un problème particulièrement courant lors du mélange des champs de studio odoo avec des personnalisations basées sur des modules.

Conclusion


Le contexte est l'un de ces mécanismes dans Odoo qui effectue discrètement beaucoup de travail. Une fois que vous comprenez comment il circule à travers les définitions de champs, les attributs de vue et l'environnement ORM, vous obtenez un niveau de contrôle beaucoup plus fin sur le comportement de votre modèle de données.


Les points clés sont simples. Utilisez les clés default_* pour guider les utilisateurs vers des données correctes sans les forcer. Mettez le contexte dynamique dans les vues plutôt que dans les définitions de champs. Utilisez toujours with_context() au lieu de modifier le contexte sur place. Et gardez votre contexte léger afin qu'il n'interfère pas avec d'autres parties du système de manière inattendue.

Que vous travailliez sur un tutoriel de champ odoo, que vous construisiez un module personnalisé ou que vous dépanniez un champ qui se comporte de manière étrange, comprendre le contexte fera toujours partie de la réponse.


Chez Dasolo, nous aidons les entreprises à mettre en œuvre, personnaliser et optimiser Odoo pour s'adapter à leurs véritables flux de travail. Si vous travaillez sur une personnalisation où le contexte est impliqué et que vous n'êtes pas sûr de l'avoir bien fait, ou si vous souhaitez simplement discuter de votre mise en œuvre Odoo, nous sommes heureux de vous aider.

Contactez notre équipe via la page de contact et faites-nous savoir ce que vous construisez. Nous travaillons avec des entreprises de toutes tailles pour faire fonctionner Odoo comme il se doit.

Champs de contexte dans Odoo : Un guide pratique
Dasolo 6 mars 2026
Partager cet article
Se connecter pour laisser un commentaire.