Passa al contenuto

Campi Context in Odoo: Guida Pratica per Sviluppatori

Scopri in che modo il contesto influenza il comportamento dei campi, i valori predefiniti e i filtri dei record all'interno dell'ORM di Odoo
6 marzo 2026 di
Campi Context in Odoo: Guida Pratica per Sviluppatori
Dasolo
| Ancora nessun commento

Se hai lavorato con l'ORM di Odoo o hai modificato viste, avrai sicuramente incontrato il termine context. Lo trovi nelle definizioni dei campi, negli attributi XML delle viste e nelle chiamate Python. Per molti è una di quelle cose che funziona senza pensarci… finché non smette di funzionare.


Capire come funzionano i campi di contesto in Odoo non è teoria fine a sé stessa: incide su come si completano i form, su quali record vengono mostrati e su come vengono calcolati i campi computati. Sia che tu stia facendo una semplice personalizzazione Odoo sia che stia sviluppando un modulo complesso, un contesto ben progettato riduce drasticamente il tempo speso a debug.


Questa guida spiega che cos’è il contesto, come si propaga all'interno del framework Odoo e come usarlo con sicurezza nei progetti reali.

Cos'è il contesto in Odoo


In Odoo il contesto è semplicemente un dizionario Python che accompagna ogni richiesta, ogni chiamata di metodo e ogni operazione sui record. Non è un tipo di campo nell'ORM: non troverai fields.Context(). È invece un meccanismo che modifica il comportamento dei campi e dei metodi a runtime.


Immaginalo come un insieme di istruzioni invisibili legate all'operazione corrente: indicano ad Odoo di suggerire un valore predefinito, includere record archiviati, calcolare una descrizione in un'altra lingua oppure applicare un determinato dominio quando si apre un selettore di record.


Dove appare il contesto

Nel modello dati di Odoo il contesto si manifesta principalmente in tre punti:

  • Nelle definizioni dei campi in Python: il parametro context sui campi relazionali come Many2one, One2many e Many2many.
  • Negli attributi delle viste XML: l'attributo context sui tag <field> nelle viste form, tree e kanban.
  • Nell'ambiente dell'ORM: accessibile tramite self.env.context in Python e modificabile con self.with_context(key=value).

In tutti i casi il ruolo del contesto è lo stesso: trasportare informazioni aggiuntive che influenzano il comportamento di un campo o di una chiamata in fase di esecuzione.

Come funziona il contesto nel modello dati di Odoo


Il contesto scorre durante l'intero ciclo di vita della richiesta: dall'apertura di una scheda fino al salvataggio del record. Ecco i meccanismi principali in pratica.


Valori predefiniti con default_*

Un pattern molto usato è la chiave default_field_name. Se passi un elemento di contesto che inizia con default_, Odoo lo usa per precompilare il campo quando si crea un nuovo record.

Per esempio, se un pulsante apre il form di un ordine di vendita e inserisce {"default_partner_id": 42} nel contesto, il campo cliente verrà già impostato sul partner con ID 42. L'utente trova il modulo compilato senza bisogno di logica Python aggiuntiva.


Questo schema è molto comune nello sviluppo Odoo per creare flussi di navigazione che guidano l'utente verso il valore atteso.


L'attributo context sui campi relazionali

Quando dichiari un campo Many2one, One2many o Many2many in Python puoi passare un parametro context. Quel contesto viene applicato ogni volta che il campo carica o crea record attraverso popup o dropdown.


Ad esempio, un Many2one verso res.partner con context={"default_is_company": True} farà sì che, se l'utente crea un partner direttamente da quel campo, la casella "È una azienda" sia già selezionata. Si spinge l'utente verso il dato corretto senza imporlo.


Contesto nelle viste XML

Nelle viste XML l'attributo context su un tag campo funziona allo stesso modo, ma può essere dinamico: puoi riferirti ad altri campi usando la sintassi di valutazione di Odoo.


Questo ti permette di costruire form intelligenti in cui il contesto di un campo dipende dal valore di un altro, una tecnica essenziale nelle personalizzazioni Odoo per comportamenti relazionali senza scrivere codice Python aggiuntivo.


Leggere e modificare il contesto in Python

All'interno di qualsiasi metodo di modello puoi leggere il contesto corrente con self.env.context, che restituisce il dizionario così com'era al momento della chiamata.


Per eseguire codice con un contesto modificato usa self.with_context(key=value). Questo ritorna un nuovo recordset che porta il contesto aggiornato senza alterare quello originale: un pattern pulito e non distruttivo, in linea con lo stile funzionale di Odoo.


Chiavi di contesto predefinite

Odoo usa alcune chiavi riservate che attivano comportamenti specifici nel framework:


  • lang: cambia la lingua usata per i campi tradotti.
  • active_test: impostandolo a False includi nei risultati anche i record archiviati.
  • no_recompute: evita la ricalcolazione dei campi memorizzati.
  • mail_notrack: disabilita il tracciamento nel chatter per un'operazione di write.
  • allowed_company_ids: gestisce la visibilità in ambienti multi-company.
  • bin_size: restituisce le dimensioni dei file invece del contenuto binario per i campi Binary.

Conoscere queste chiavi è fondamentale per uno sviluppatore Odoo perché permette di controllare comportamenti senza scrivere logica custom.

Esempi pratici per l'azienda


Il contesto non è solo affare degli sviluppatori: risolve problemi concreti nei workflow aziendali. Ecco cinque casi d'uso frequenti.


1. CRM: preimpostare il team di vendita sui nuovi lead

Se un responsabile di vendita lavora su una vista filtrata per il proprio team e clicca "Nuovo", si aspetta che il lead sia assegnato automaticamente al suo team. Basta passare default_team_id nell'action context per ottenere il comportamento: il form si apre già con il team corretto.


2. Vendite: scegliere il listino in base al segmento cliente

Quando si crea un preventivo da una vista per una specifica categoria di clienti, il listino può essere preimpostato via contesto (default_pricelist_id). Il venditore è guidato al prezzo corretto senza che la scelta sia imposta rigidamente.


3. Magazzino: filtrare le ubicazioni nei trasferimenti

Nei processi di magazzino il campo ubicazione di origine può essere limitato alle ubicazioni di un singolo magazzino passando un dominio nel contesto del Many2one, rendendo l'interfaccia più pulita e riducendo gli errori in ambienti multi-magazzino.


4. Contabilità: righe di fattura nella lingua del cliente

Usando la chiave lang nel contesto le descrizioni vengono forzate nella lingua del cliente: una fattura indirizzata a un cliente francese mostrerà nomi e descrizioni in francese anche se il database è in inglese.


5. Modelli custom: mostrare prodotti archiviati in una vista speciale

Un team operativo può aver bisogno di vedere prodotti dismessi insieme a quelli attivi. Un'azione che imposta active_test: False nel suo contesto mostra tutti i prodotti in quella vista senza toccare il comportamento globale dell'applicazione.

Creare e personalizzare il contesto sui campi


Ci sono due modi per aggiungere o modificare il contesto sui campi: usare Odoo Studio per interventi no-code oppure intervenire con Python e XML per controllo completo. Questo è un punto chiave in ogni tutorial tecnico Odoo sui campi.


Usare Odoo Studio

Odoo Studio permette di cambiare alcune proprietà dei campi senza scrivere codice. Per i campi relazionali Studio espone un'opzione per configurare il contesto e impostare valori predefiniti applicati quando si crea un nuovo record dal campo.


È comodo per casi semplici: preimpostare azienda, team, categoria o responsabile. Però il supporto al contesto in Studio è volutamente semplificato: per contesti dinamici che dipendono da altri campi servirà intervenire con codice tecnico.


Ricorda che il contesto impostato da Studio viene salvato direttamente nella vista. Se poi aggiungi una personalizzazione tecnica sulla stessa vista, devi considerare il contesto definito da Studio per evitare conflitti.


Definire il contesto sui campi in Python

In un modulo custom il contesto si aggiunge nella definizione del campo. Per esempio, su un Many2one il parametro context accetta un dizionario statico:


Questo contesto statico vale ogni volta che il campo carica o crea record correlati e non cambia in base ai valori del record corrente. Se hai bisogno di contesto che reagisca allo stato della singola riga, è meglio metterlo a livello di vista.


Definire il contesto nelle viste XML

Nelle viste XML l'attributo context accetta una stringa valutata a runtime: puoi riferirti ai valori dei campi, all'ID dell'utente (uid), all'active_id e ad altre variabili.

Questo rende il contesto a livello di vista molto più flessibile rispetto a quello a livello di campo. È l'approccio standard nel framework Odoo quando il comportamento di un campo deve dipendere da un altro, ed è il modo per creare interfacce che appaiono naturali agli utenti.


Passare contesto tramite azioni di finestra

Il contesto può essere impostato anche sulle azioni ir.actions.act_window. Menu e pulsanti passano il contesto alle viste che aprono: il dizionario dell'action viene unito al contesto di sessione quando la vista viene caricata.


Questo è il modo più pulito per gestire scenari come l'esempio del team CRM: il contesto vive sull'azione, non sul campo, quindi puoi avere default diversi a seconda del punto di navigazione senza modificare il modello.

Buone pratiche


Lavorare con il contesto diventa molto più semplice se segui alcune abitudini coerenti. Valgono sia per lo sviluppo di moduli sia per le personalizzazioni rapide.


  • Usa il contesto per suggerire, non per imporre. I default via contesto dovrebbero guidare l'utente senza bloccare scelte legittime. Se ti serve una regola rigida, usa un dominio o un metodo onchange.
  • Metti il contesto dinamico nelle viste, non nelle definizioni dei campi. Il contesto a livello di campo è statico; se deve riflettere lo stato del record usa la vista XML.
  • Usa with_context() invece di modificare direttamente env.context. L'ambiente è pensato come immutabile durante una chiamata: crea un nuovo environment con with_context() per non avere effetti collaterali.
  • Sii intenzionale su cosa passi nel contesto. Le chiavi si accumulano lungo la catena di chiamate: mettere troppi elementi inutili può portare a comportamenti inattesi in metodi che verificano quelle chiavi.
  • Usa il contesto per passare flag che influenzano la logica condizionale. Un pattern comune è mettere from_wizard: True e controllarlo in compute o onchange per applicare comportamenti diversi, evitando di creare campi di stato nel modello.
  • Documenta le chiavi di contesto personalizzate nel tuo modulo. Le chiavi sono invisibili a chi non sa cercarle: aggiungi commenti o docstring che spieghino cosa fa ogni chiave personalizzata; sarà utile quando tornerai sul codice dopo mesi.

Errori comuni


I bug legati al contesto sono spesso difficili da trovare perché il contesto è invisibile nell'interfaccia. Ecco gli errori che ricorrono più spesso nei progetti reali.


Considerare default_* come valori obbligatori

Un default impostato via contesto si applica solo quando un record viene creato tramite un form che riceve quel contesto. Se crei record programmaticamente senza passare il contesto, il default non viene applicato. Non confondere i default di contesto con i parametri default definiti a livello di campo: sono comportamenti diversi.


Modificare direttamente il dizionario di contesto

Il dizionario di contesto è condiviso lungo la catena di chiamate. Se modifichi self.env.context in modo diretto puoi interferire con codice eseguito nella stessa transazione. Il pattern corretto è sempre self.with_context(new_key=value), che copia il contesto e aggiunge le modifiche.


Passare troppe informazioni nel contesto

Ogni chiave che aggiungi viaggia attraverso tutte le chiamate successive. Alcune routine Odoo guardano specifiche chiavi e cambiano comportamento: chiavi inattese possono attivare rami di codice non voluti. Mantieni il contesto snello e mirato.


Dimenticare active_test quando cerchi record archiviati

Per default le chiamate search() e search_read() filtrano fuori i record archiviati (active = False). Se il tuo codice deve lavorare su record archiviati devi passare esplicitamente active_test: False nel contesto: dimenticarlo è un errore comune in personalizzazioni di inventario e prodotto.


Conflitti di contesto tra Studio e codice custom

Se Odoo Studio ha impostato un contesto su un campo in una vista e poi aggiungi un'estensione tecnica sulla stessa vista, i contesti possono sovrapporsi o sovrascriversi a seconda dell'ordine di merge XML. Controlla sempre il contesto esistente prima di aggiungerne uno nuovo tramite view inheritance, specialmente quando mescoli campi creati con Odoo Studio e personalizzazioni di modulo.

Conclusione


Il contesto è uno di quei meccanismi che lavora dietro le quinte in Odoo. Quando sai come si propaga tra definizioni di campo, attributi di vista e ambiente ORM, ottieni un controllo molto più preciso sul comportamento del modello dati.


I punti principali da ricordare sono semplici: usa le chiavi default_* per guidare gli utenti senza forzarli; metti il contesto dinamico nelle viste; usa sempre with_context() invece di mutare il contesto in place; e mantieni il contesto il più possibile snello per evitare effetti collaterali.

Che tu stia seguendo un tutorial sui campi Odoo, sviluppando un modulo o risolvendo un comportamento anomalo, comprendere il contesto sarà quasi sempre parte della soluzione.


Da Dasolo supportiamo aziende nell'implementazione, personalizzazione e ottimizzazione di Odoo per adattarlo ai processi reali. Se stai lavorando a una personalizzazione che usa il contesto e hai dubbi, o vuoi semplicemente confrontarti sulla tua implementazione Odoo, possiamo aiutarti.

Contattaci tramite la pagina dei contatti e raccontaci cosa stai costruendo. Lavoriamo con aziende di tutte le dimensioni per far funzionare Odoo come dovrebbe.

Campi Context in Odoo: Guida Pratica per Sviluppatori
Dasolo 6 marzo 2026
Condividi articolo
Accedi per lasciare un commento