Introduzione
Ogni schermata di Odoo è fatta di campi: alcuni vanno compilati ogni volta, altri possono partire già riempiti con un valore sensato. I valori predefiniti servono proprio a questo: offrire un punto di partenza utile che velocizza l’inserimento dati. Il meccanismo è semplice, ma ha diversi livelli — capirli evita sorprese quando si configura il sistema per il team.
Che tu sia un power user che usa Odoo Studio o un sviluppatore che lavora sui modelli, comprendere come funzionano i default ti fa risparmiare tempo e riduce errori di configurazione che diventano difficili da diagnosticare in seguito.
Questa guida spiega cosa sono i valori predefiniti in Odoo, come il framework li applica, quando preferire default statici o dinamici, e come impostarli sia via Odoo Studio che scrivendo codice Python in un modulo.
Cos’è il valore predefinito in Odoo
Nel cuore del modello ORM di Odoo, un valore predefinito è semplicemente il valore assegnato a un campo quando si crea un nuovo record, prima che l’utente inserisca qualcosa. Non è una regola obbligatoria: l’utente può sovrascriverlo liberamente. Serve a rendere il modulo subito più pratico e coerente.
Quasi tutti i tipi di campo supportano un parametro di default: Char, Integer, Float, Boolean, Date, Many2one, Selection ecc. Il default può essere un valore fisso, una lambda Python o il riferimento a un metodo: ognuno è utile a seconda del contesto.
Con Odoo Studio impostare un default è immediato: nella scheda delle proprietà del campo trovi un campo per il valore iniziale. Questo permette agli utenti non tecnici di stabilire predefiniti statici senza codice, migliorando la qualità dei dati con pochi click.
I default non sono salvati nella colonna del database come valori permanenti per quel campo: possono risiedere nella definizione Python del modello o come record di ir.default nel database, a seconda di come sono stati configurati. Quando si crea un nuovo record, Odoo legge queste fonti e precompila il modulo prima che l’utente lo veda.
Come funziona il valore predefinito
All’apertura di un nuovo form, il framework invoca default_get() sul modello: questo metodo raccoglie i default disponibili e restituisce un dizionario che associa ogni campo al suo valore iniziale. Il form viene quindi popolato con quei valori.
In Odoo i default si presentano in quattro modalità principali, ciascuna pensata per uno scenario d’uso diverso.
Default statici
Sono valori fissi inseriti nella definizione del campo o tramite Studio, ad esempio impostare un Boolean a True o una Selection su 'draft'. Sono la soluzione più semplice e spesso sufficiente per le necessità quotidiane del modello dati.
Default dinamici (lambda o metodo)
Sono funzioni Python che vengono eseguite al momento della creazione del record: permettono di usare informazioni runtime come la data corrente o l’utente connesso. Tipici esempi sono impostare l’utente loggato come responsabile o usare la data odierna come data del documento.
Esempi in Python mostrano chiaramente la differenza tra statico e dinamico:
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Default statico
x_priority_level = fields.Selection(
[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')],
string='Priority Level',
default='medium',
)
# Default dinamico: utente corrente
x_assigned_by = fields.Many2one(
'res.users',
string='Assigned By',
default=lambda self: self.env.user,
)
# Default dinamico: data odierna
x_expected_date = fields.Date(
string='Expected Close Date',
default=lambda self: fields.Date.today(),
)
Default basati sul contesto
Si tratta di valori passati tramite il context dell’azione usando la convenzione default_nomecampo. Quando si crea un record da un altro record correlato, Odoo passa spesso dei key/value che diventano default per campi relazionati: per esempio aprendo una nuova attività da un progetto verrà pre-impostato il progetto stesso. È il modo usato dal framework per mantenere coerenza nella navigazione.
Default personali con ir.default
Odoo supporta anche default a livello utente tramite record di ir.default. Un amministratore può definire un default specifico per un campo e un utente: quando quell’utente crea un nuovo record, il suo default personale ha priorità sul default di modello. Utile in contesti multi-utente con preferenze diverse.
Ordine di priorità
Quando ci sono più fonti per lo stesso campo, Odoo risolve i default così: primi i record ir.default specifici per l’utente, poi quelli a livello di azienda, poi il default definito nel modello Python. I default passati via context al runtime sovrascrivono il default di modello. Conoscere quest’ordine aiuta a capire perché un campo non mostra il valore atteso.
Quando conviene usarlo in azienda
I valori predefiniti sono usati praticamente in tutti i moduli di Odoo. Di seguito cinque casi pratici tratti dai processi aziendali reali.
CRM: responsabile predefinito per i lead
Quando un commerciale crea un nuovo lead, il campo Responsabile viene spesso impostato automaticamente sull’utente che sta creando il record. Così ogni lead non resta ‘senza proprietario’ e gli utenti vedono subito i propri lead. Questa impostazione, che usa l’utente corrente come default, migliora l’adozione dell’CRM con un intervento minimo.
Vendite: condizioni di pagamento predefinite negli ordini
Su un ordine di vendita i termini di pagamento e il listino si precompilano in base alla scheda cliente. Se un cliente è configurato con Net 30, quell’impostazione comparirà automaticamente sugli ordini creati per quel cliente, riducendo errori e mantenendo coerenza contrattuale anche quando ordini vengono creati da venditori diversi.
Magazzino: ubicazioni predefinite per i trasferimenti
Nei trasferimenti interni o negli aggiustamenti inventariali, le ubicazioni di origine e destinazione possono essere impostate in base alla configurazione del magazzino. Gli operatori che lavorano sempre nella stessa zona troveranno l’ubicazione corretta già selezionata, risparmiando clic e diminuendo il rischio di errori sotto pressione.
Contabilità: giornali predefiniti negli scritture
Fatture e note di credito vengono aperte con il giornale appropriato in base al tipo di registrazione e alla configurazione aziendale. L’uso di default dinamici basati sulle impostazioni aziendali evita di codificare valori che potrebbero cambiare in futuro e garantisce che il diario corretto venga sempre selezionato.
Progetti: fase iniziale per le nuove attività
Una nuova attività creata all’interno di un progetto parte tipicamente dalla prima fase configurata nella board Kanban del progetto. Se l’attività viene creata partendo dal record del progetto, il context può inoltre pre-impostare il progetto stesso e talvolta l’assegnatario, mantenendo le attività nella colonna giusta fin dall’inizio.
Come creare o personalizzare i valori predefiniti
Tre sono le strade principali per impostare default in Odoo: dall’assenza di codice con Studio fino al controllo completo con un modulo Python personalizzato.
Con Odoo Studio (senza codice)
Studio offre un’interfaccia grafica dove impostare un valore predefinito per qualsiasi campo del form. È il modo più rapido per apportare modifiche non tecniche.
- Apri Studio sul modulo che vuoi modificare
- Seleziona il campo da configurare
- Nella colonna delle proprietà a destra trova l’impostazione Default Value
- Inserisci o scegli il valore che vuoi usare come default
- Salva ed esci da Studio
Studio salva la scelta come record di ir.default nel database e la applica a livello azienda salvo restrizioni utente. Funziona bene per default statici su Selection, Boolean, Char e Integer; per i Many2one consente di scegliere un record esistente. È il modo più pratico per creare campi e valori iniziali senza scrivere codice.
Ricorda però che modificare un default in Studio non cambia i record già esistenti: il nuovo valore si applicherà solo ai record creati dopo la modifica.
Con Python nelle personalizzazioni tecniche
Quando serve logica più avanzata, i default si definiscono direttamente nella dichiarazione del campo in Python. Questo dà controllo totale su default statici, lambda e metodi e resta la scelta preferibile quando il valore dipende da informazioni runtime come utente, data o configurazioni aziendali.
Esempio pratico per un modulo personalizzato:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Default booleano statico
x_requires_review = fields.Boolean(
string='Requires Review',
default=False,
)
# Default selection statico
x_delivery_preference = fields.Selection(
[('standard', 'Standard'), ('express', 'Express')],
string='Delivery Preference',
default='standard',
)
# Default dinamico tramite metodo
def _default_note(self):
return self.env['ir.config_parameter'].sudo().get_param(
'sale.default_note', default=''
)
x_internal_note = fields.Text(
string='Internal Note',
default=_default_note,
)
Questo approccio segue le convenzioni standard di sviluppo Odoo e funziona per tutti i tipi di campo. I default basati su metodo sono utili quando la logica è più complessa di una semplice lambda.
Creare record ir.default programmaticamente
È possibile anche creare o aggiornare record di ir.default via API XML-RPC o tramite file dati di un modulo. Utile quando vuoi includere una configurazione di default come parte di un’installazione di modulo: ir.default accetta nome del modello, nome del campo, valore e opzionalmente company o user per limitare lo scope.
Questo metodo è meno frequente nell’uso quotidiano, ma comune quando si confezionano moduli installabili che devono applicare default sensati all’installazione.
Buone pratiche per i valori predefiniti in Odoo
Impostare default per campi obbligatori
Se un campo è obbligatorio, assegna un default pratico dove possibile. Così si evita che gli utenti incontrino errori di salvataggio involontari. Combinare required=True con un default utile è una buona regola progettuale.
Usare lambda per le date
Mai hardcodare una data come default: usa lambda self: fields.Date.today() così il valore sarà sempre la data corrente al momento della creazione. Un valore fisso diventerebbe subito obsoleto.
Tenere la logica dei default leggera
I metodi dei default vengono eseguiti all’inizializzazione del form, quindi ogni volta che un utente apre un nuovo record. Evita query pesanti, chiamate a servizi esterni o calcoli onerosi. Se serve un’elaborazione più complessa, valuta un onchange o un campo computed attivato da un altro campo.
Usare il context per i flussi di navigazione
Quando crei azioni o pulsanti che aprono nuovi form, passa i valori con default_field_name nel context invece di affidarti solo ai default del modello. È la pratica usata dal framework e mantiene le personalizzazioni coerenti con il comportamento nativo.
Testare i default con più profili utente
I default che fanno riferimento a self.env.user o self.env.company cambiano in base all’utente connesso. Testa sempre con almeno due utenti diversi e, se usi multi-company, con più configurazioni aziendali: ciò che funziona per un admin può risultare errato per un utente standard.
Errori ricorrenti da evitare
Non usare oggetti mutabili come default
Errore classico di Python: non scrivere default=[] o default={}. La stessa lista o dizionario verrebbe condivisa tra istanze, causando perdite di dati tra record. Usa invece una lambda: default=lambda self: [], così ogni record riceve un oggetto nuovo.
I default non attivano gli onchange
Impostare un default non scatena i metodi onchange. Questo significa che eventuali aggiornamenti automatici collegati a un onchange non si attiveranno all’inizializzazione. Se vuoi che gli onchange vengano eseguiti all’apertura del form, devi richiamarli esplicitamente con un override di default_get o gestire diversamente la logica.
Conflitti tra ir.default e definizione di modello
Se hai sia un default in Python sia un ir.default impostato (ad esempio tramite Studio), Odoo applicherà prima il record di ir.default, sovrascrivendo il valore di modello. Questo genera spesso confusione quando un cambio in Studio apparentemente ‘rompe’ un valore impostato dal codice.
Confondere default con obbligatorietà
Un valore predefinito non rende automaticamente un campo obbligatorio: l’utente può cancellarlo prima di salvare e il record risulterà vuoto. Se il valore è sempre necessario, combina il default con required=True.
Non hardcodare ID di utenti o aziende
Un default come default=1 che punta a un ID numerico è fragile: non funziona se i record hanno ID diversi tra ambienti. Usa riferimenti dinamici come lambda self: self.env.company.id o lambda self: self.env.ref('module.xml_id').id.
Conclusione
I valori predefiniti sono una leva piccola ma efficace nel modello dati di Odoo: riducono l’immissione manuale, indirizzano le scelte degli utenti e rendono i form più usabili. Che tu li imposti con Studio per interventi rapidi o in Python per casi complessi, capirli aiuta a costruire implementazioni più solide.
Punti chiave da ricordare: i default si applicano solo al momento della creazione del record, non attivano onchange, esiste un ordine di priorità tra le fonti dei default, e gli oggetti mutabili vanno sempre creati tramite lambda.
Impostare correttamente i default spesso distingue un form intuitivo da uno che causa attriti ogni volta che si crea un nuovo record. È un piccolo investimento che ripaga quotidianamente in efficienza e qualità dei dati.
Da Dasolo supportiamo le aziende nell’implementazione, personalizzazione e ottimizzazione di Odoo su misura dei loro processi. Se ti serve aiuto per configurare i default dei campi, creare campi custom o disegnare un modello dati che funzioni davvero per il tuo team, possiamo affiancarti. Contattaci parliamo della tua implementazione Odoo.