Introduzione
Ogni modulo in Odoo ha dei campi. Alcuni devono essere compilati manualmente ogni volta. Ma molti campi possono avere un valore predefinito sensato in modo che gli utenti partano già con qualcosa di utile. Il meccanismo del valore predefinito in Odoo è semplice in superficie ma ha diversi strati che vale la pena comprendere, specialmente quando si configurano o personalizzano i moduli per il proprio team.
Che tu sia un utente aziendale che regola un campo tramite Odoo Studio o uno sviluppatore che lavora attraverso un tutorial sui campi di Odoo, sapere come funzionano i valori predefiniti fa risparmiare tempo e previene il tipo di errori di configurazione silenziosi che sono difficili da diagnosticare in seguito.
Questa guida copre cosa sono i valori predefiniti in Odoo, come funzionano a livello ORM, quando utilizzare valori predefiniti statici rispetto a dinamici e come configurarli tramite Odoo Studio o codice Python.
Che cos'è il Valore Predefinito in Odoo
Nell'ORM di Odoo, un valore predefinito è ciò che viene assegnato a un campo quando viene creato un nuovo record, prima che l'utente compili qualcosa. Non è un vincolo. L'utente può cambiarlo liberamente. È semplicemente un punto di partenza che rende il modulo più utile fin da subito.
Il parametro default è disponibile su praticamente ogni tipo di campo nel framework Odoo: Char, Integer, Float, Boolean, Date, Many2one, Selection e altri. Può essere un valore semplice, una lambda Python o un riferimento a un metodo. Tutti questi sono considerati meccanismi di default validi a seconda del caso d'uso.
In Odoo Studio, i valori di default appaiono nel pannello delle proprietà del campo come un semplice input. Gli utenti aziendali possono impostare un default statico senza scrivere alcun codice. Questo lo rende uno dei modi più accessibili per migliorare la coerenza dei dati utilizzando i campi di Odoo Studio, senza richiedere il coinvolgimento di uno sviluppatore.
A livello di database, i default non sono memorizzati nella colonna del campo stesso. Vivono o nella definizione del modello Python o nei record ir.default nel database, a seconda di come sono stati configurati. Quando viene creato un nuovo record, Odoo legge quei default e precompila il modulo prima che l'utente lo veda.
Come Funziona il Valore Predefinito
Quando un utente apre un nuovo modulo in Odoo, il framework chiama default_get() sul modello. Questo metodo raccoglie tutti i default dei campi e restituisce un dizionario che mappa i nomi dei campi ai loro valori di default. Il modulo quindi precompila quei campi prima che l'utente faccia qualsiasi cosa.
Ci sono quattro tipi principali di valori di default in Odoo, ognuno dei quali copre uno scenario diverso.
Defaults Statici
Un valore fisso codificato nella definizione del campo o impostato tramite Studio. Ad esempio, impostare un campo Boolean su True per default, o un campo Selection su 'draft'. Questi sono il tipo più semplice e coprono la maggior parte dei casi d'uso quotidiani in un modello di dati Odoo.
Defaults Dinamici tramite Lambda o Metodo
Una funzione o lambda Python che viene eseguita al momento della creazione del record. Questo consente default che dipendono dalla data corrente, dall'utente connesso o da qualsiasi altro contesto disponibile. Ad esempio, impostare l'utente corrente come la persona responsabile di default, o utilizzare oggi come data di documento di default.
Ecco come appaiono i default statici e dinamici in una definizione di modello Python, seguendo il modello di sviluppo standard di Odoo:
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Default statico
x_priority_level = fields.Selection(
[('low', 'Basso'), ('medium', 'Medio'), ('high', 'Alto')],
string='Livello di Priorità',
default='medium',
)
# Default dinamico: utente corrente
x_assigned_by = fields.Many2one(
'res.users',
string='Assegnato a',
default=lambda self: self.env.user,
)
# Default dinamico: data di oggi
x_expected_date = fields.Date(
string='Data di Chiusura Attesa',
default=lambda self: fields.Date.today(),
)
Defaults Basati sul Contesto
Valori passati attraverso il contesto dell'azione utilizzando la convenzione default_field_name. Quando fai clic su Crea all'interno di un record correlato, Odoo spesso passa valori di contesto che diventano predefiniti per i campi relazionali. Ad esempio, aprire un nuovo compito all'interno di un progetto imposta automaticamente il campo progetto. Questo fa parte di come funzionano i flussi di navigazione nel framework Odoo ed è guidato interamente da chiavi di contesto che qualsiasi sviluppatore o utente avanzato può configurare.
Valori predefiniti a livello utente tramite ir.default
Odoo supporta anche valori predefiniti specifici per l'utente tramite record ir.default. Un amministratore può configurare un valore predefinito personale per un dato campo su un dato modello. Quando quell'utente crea un nuovo record, il suo valore predefinito personale ha la precedenza sul valore predefinito a livello di modello. Questo è utile in ambienti multi-utente dove diversi membri del team hanno preferenze lavorative diverse, ed è una delle capacità meno conosciute dell'odoo orm.
Ordine di priorità
Quando esistono più fonti predefinite per lo stesso campo, Odoo le risolve in questo ordine: prima ir.default specifico per l'utente, poi ir.default a livello aziendale, quindi il predefinito definito nel modello Python. I valori predefiniti basati sul contesto passati a runtime sovrascrivono anche i valori predefiniti a livello di modello. Conoscere questo ordine ti aiuta a capire perché un campo potrebbe non mostrare il valore che ti aspetti quando apri un nuovo modulo.
Casi d'Uso Aziendali
I valori predefiniti appaiono praticamente in ogni modulo in un'implementazione Odoo. Ecco cinque esempi pratici da flussi di lavoro aziendali reali.
CRM: Venditore predefinito su Nuovi Lead
Quando un venditore crea un nuovo lead o opportunità, il campo Responsabile è predefinito sull'utente corrente. Questo evita che ogni lead inizi non assegnato e richieda attribuzione manuale. Il predefinito è impostato con lambda self: self.env.user nella definizione del modello. In pratica, questo piccolo dettaglio migliora l'adozione del CRM perché gli utenti vedono immediatamente i propri lead senza alcun passaggio extra.
Vendite: Termini di pagamento predefiniti sugli Ordini
Quando viene creato un ordine di vendita per un cliente, campi come listino prezzi e termini di pagamento sono predefiniti in base alla configurazione del partner cliente. Un cliente impostato con termini di pagamento Net 30 avrà quei termini già compilati su ogni nuovo ordine. Questo riduce gli errori di selezione manuale e garantisce che i termini concordati con ciascun cliente siano applicati in modo coerente, anche quando diversi venditori creano gli ordini.
Inventario: Località predefinite sui Trasferimenti
Quando si crea un trasferimento interno o un aggiustamento di inventario, i campi di località di origine e destinazione sono predefiniti sulle località configurate nelle impostazioni del magazzino. Il personale del magazzino che lavora sempre all'interno della stessa zona troverà la località corretta già selezionata quando apre un nuovo trasferimento. Questo risparmia clic e riduce il rischio di selezionare la località sbagliata sotto pressione temporale.
Contabilità: Giornale predefinito sulle voci
Quando un utente crea una nuova fattura cliente o una bolletta fornitore, Odoo imposta automaticamente il giornale appropriato in base al tipo di voce e alla configurazione dell'azienda. Un contabile che apre una nuova bolletta fornitore non deve selezionare manualmente il giornale degli acquisti ogni volta. Il predefinito viene risolto dinamicamente dalle impostazioni aziendali, non da un valore codificato, il che significa che rimane corretto anche se i giornali vengono riconfigurati in seguito.
Progetto: Fase predefinita su Nuove Attività
Quando viene creata una nuova attività all'interno di un progetto, essa inizia nella prima fase della configurazione kanban di quel progetto. Se l'attività viene creata cliccando un pulsante su un record di progetto specifico, i predefiniti basati sul contesto compilano anche il progetto e talvolta l'assegnatario. I team che utilizzano Odoo per la gestione dei progetti beneficiano di questi predefiniti perché mantengono le nuove attività nel posto giusto dal momento in cui vengono create, senza alcuna configurazione manuale.
Creazione o Personalizzazione dei Valori Predefiniti
Ci sono tre approcci principali per impostare valori predefiniti in Odoo, che vanno da un click-through senza codice in Studio a un controllo completo in Python in un modulo personalizzato.
Utilizzando Odoo Studio (Nessun Codice)
Odoo Studio fornisce un'interfaccia visiva per impostare valori predefiniti su qualsiasi campo nei tuoi moduli. Per impostare un predefinito tramite Studio:
- Apri l'interfaccia di Studio sul modulo che desideri modificare
- Clicca sul campo che desideri configurare
- Nel pannello delle proprietà del campo a destra, trova il campo Valore Predefinito
- Inserisci o seleziona il valore che desideri come predefinito iniziale
- Salva e esci da Studio
Studio memorizza questa configurazione come un ir.default record nel database. Si applica a livello aziendale a meno che un amministratore non specifichi una restrizione a livello utente. Questo approccio funziona bene per i valori predefiniti statici su campi di Selezione, Booleani, Char e Interi. Per i campi Many2one, Studio ti consente di scegliere un record esistente da un menu a discesa. È uno degli usi più pratici della creazione di campi in Odoo senza scrivere alcun codice.
Una cosa da tenere a mente: cambiare il valore predefinito tramite Studio dopo che gli utenti hanno già iniziato a creare record non aggiorna quei record esistenti. Il nuovo valore predefinito si applica solo ai record creati dopo la modifica.
Utilizzare Python nella Personalizzazione Tecnica
Per la personalizzazione tecnica di Odoo, i valori predefiniti sono impostati direttamente nella definizione del campo all'interno del modello Python. Questo offre il pieno controllo sui valori statici, sulle lambda dinamiche e sui valori predefiniti basati su metodi. È l'approccio preferito in qualsiasi scenario di sviluppo Odoo in cui il valore predefinito dipende da informazioni in tempo reale come l'utente attuale, la data odierna o la configurazione dell'azienda.
Ecco un esempio che mostra diversi tipi di valori predefiniti che potresti aggiungere a un modulo personalizzato:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Valore predefinito Boolean statico
x_requires_review = fields.Boolean(
string='Richiede Revisione',
default=False,
)
# Valore predefinito di Selezione statico
x_delivery_preference = fields.Selection(
[('standard', 'Standard'), ('express', 'Espresso')],
string='Preferenza di Consegna',
default='standard',
)
# Valore predefinito dinamico utilizzando un metodo
def _default_note(self):
return self.env['ir.config_parameter'].sudo().get_param(
'sale.default_note', default=''
)
x_internal_note = fields.Text(
string='Nota Interna',
default=_default_note,
)
Questo schema segue la convenzione standard dei campi Python di Odoo e funziona su tutti i tipi di campo di Odoo. Il valore predefinito basato su metodo è particolarmente utile quando la logica è più complessa di una singola espressione lambda.
Utilizzare i record ir.default Programmaticamente
Puoi anche creare o aggiornare record ir.default tramite l'API XML-RPC di Odoo o all'interno di un file dati di un modulo. Questo è utile quando si spedisce una configurazione predefinita come parte dell'installazione di un modulo personalizzato. Il modello ir.default accetta un nome di modello, un nome di campo, un valore e, facoltativamente, un'azienda o un utente per delimitare il valore predefinito.
Questo approccio è meno comune nello sviluppo quotidiano, ma si presenta quando si costruiscono moduli Odoo installabili che devono configurare valori predefiniti sensati come parte della loro routine di installazione.
Migliori Pratiche per i Valori Predefiniti in Odoo
Impostare Valori Predefiniti sui Campi Obbligatori
Se un campo è obbligatorio, fornisci un valore predefinito sensato ogni volta che è possibile. Questo riduce l'attrito e previene errori di salvataggio quando gli utenti cercano di inviare un nuovo record senza rendersi conto che un campo è obbligatorio. Combinare required=True con un valore predefinito pratico è un buon schema nel modello dati di Odoo.
Usa le Lambda per i Valori Predefiniti delle Date
Non hardcodare mai una data come valore predefinito. Usa lambda self: fields.Date.today() in modo che il valore predefinito sia sempre la data corrente al momento della creazione del record. Una data hardcodata sarebbe errata per qualsiasi record creato dopo che il codice è stato scritto, il che, nella pratica, significa che è errata quasi immediatamente.
Mantieni la Logica Predefinita Leggera
Le funzioni predefinite vengono eseguite durante la creazione del record, il che significa che vengono eseguite ogni volta che un utente apre un nuovo modulo. Evita di effettuare query al database, chiamare API esterne o eseguire calcoli pesanti all'interno dei metodi predefiniti. Mantienili veloci e semplici. Se hai bisogno di qualcosa di più complesso, considera di utilizzare un onchange o un campo calcolato attivato da un altro campo.
Usa i Valori Predefiniti del Contesto per i Flussi di Navigazione
Quando costruisci azioni personalizzate o pulsanti intelligenti che aprono un nuovo modulo, passa i valori default_field_name attraverso il contesto dell'azione piuttosto che fare affidamento sui valori predefiniti statici del modello. Questo è esattamente come funzionano i pulsanti nativi di Odoo e mantiene la tua personalizzazione di Odoo allineata con le convenzioni del framework.
Testa i Valori Predefiniti con Profili Utente Multipli
I valori predefiniti dinamici che fanno riferimento a self.env.user o self.env.company si comportano in modo diverso a seconda di chi è connesso. Testa sempre con almeno due account utente diversi e con diverse configurazioni aziendali se stai eseguendo un setup multi-azienda. Ciò che funziona per un amministratore può produrre risultati inaspettati per un utente standard.
Errori Comuni
Utilizzare un Oggetto Mutabile come Predefinito
Questo è il classico errore di Python e si applica anche allo sviluppo in Odoo. Non scrivere mai default=[] o default={} per un campo. Python condivide lo stesso oggetto lista o dizionario tra tutte le istanze, il che causa la mescolanza dei dati tra i record in modi inaspettati. Usa invece una lambda: default=lambda self: []. Questo crea un nuovo oggetto ogni volta che un record viene inizializzato.
I Valori Predefiniti Non Attivano onchange
Impostare un valore predefinito non attiva i metodi onchange. Se il tuo modulo ha un onchange su un campo che normalmente attiva aggiornamenti su altri campi, il predefinito bypassa completamente quella reazione a catena. Gli utenti vedranno il valore precompilato ma nessuno degli effetti a valle che onchange produrrebbe normalmente. Se hai bisogno che l'onchange venga eseguito all'inizializzazione, devi chiamarlo esplicitamente in un'override personalizzata di default_get o gestire la logica in un modo diverso.
Valori predefiniti in conflitto da ir.default e definizione del modello
Se imposti un valore predefinito sia in Python che tramite Studio o un record ir.default, Odoo li risolve seguendo un ordine di priorità. Il record ir.default ha la precedenza sul valore predefinito a livello di modello in Python. Questa è una fonte comune di confusione quando si eseguono debug di valori di campo inaspettati, specialmente dopo una modifica della configurazione di Studio che sovrascrive silenziosamente qualcosa che uno sviluppatore ha impostato nel codice.
Assumere un predefinito significa un valore richiesto
Un campo con un valore predefinito non è automaticamente richiesto. Se l'utente svuota il campo, verrà salvato vuoto. Non fare affidamento sul predefinito da solo per garantire la completezza dei dati. Se hai sempre bisogno di un valore in quel campo, combina il predefinito con required=True.
Hardcoding degli ID record di azienda o utente
Un predefinito come default=1 che fa riferimento a un utente o a un'azienda tramite il suo ID di database è fragile. Si romperà in qualsiasi ambiente in cui quel record ha un ID diverso, che è praticamente ogni database di produzione che non è stato configurato in modo identico all'ambiente di sviluppo. Utilizza sempre riferimenti dinamici: lambda self: self.env.company.id o lambda self: self.env.ref('module.xml_id').id.
Conclusione
I valori predefiniti sono una piccola ma potente funzionalità nel modello di dati di Odoo. Riducono l'inserimento manuale dei dati, guidano gli utenti verso scelte coerenti e rendono i moduli più facili da usare per tutti nel team. Che tu li configuri tramite Odoo Studio per una rapida modifica senza codice o li definisca in Python come parte di una personalizzazione tecnica, comprendere come funzionano i predefiniti ti aiuta a costruire migliori implementazioni di Odoo.
I punti chiave da tenere a mente: i predefiniti vengono eseguiti solo al momento della creazione del record, non continuamente. Non attivano i metodi onchange. Più fonti predefinite seguono un ordine di priorità definito. E gli oggetti mutabili come liste o dizionari dovrebbero sempre essere racchiusi in una lambda quando utilizzati come predefiniti di campo.
Impostare correttamente i predefiniti è spesso la differenza tra un modulo che sembra intuitivo e uno che crea attriti per gli utenti ogni volta che devono creare un nuovo record. È un piccolo investimento che ripaga ogni giorno.
Da Dasolo, aiutiamo le aziende a implementare, personalizzare e ottimizzare Odoo per adattarlo ai loro flussi di lavoro specifici. Se hai bisogno di aiuto per configurare i valori predefiniti dei campi, costruire campi personalizzati o progettare un modello di dati Odoo che funzioni realmente per il tuo team, saremo felici di assisterti. Contattaci e parliamo della tua implementazione di Odoo.