I campi readonly in Odoo sembrano un dettaglio banale, ma in realtà sono leve decisive per controllare i processi e proteggere i dati aziendali.
Che tu sia un utente che si chiede perché certi campi sono disabilitati o un tecnico che deve modellare comportamenti, qui trovi tutte le informazioni utili per comprenderne l’impatto e usarli correttamente.
Capire il funzionamento del readonly è fondamentale per evitare modifiche involontarie, mantenere coerenza nei report e semplificare il lavoro quotidiano degli utenti.
Questa guida unisce il punto di vista operativo e quello tecnico: troverai sia consigli per la configurazione senza codice sia le opzioni per gli sviluppatori che lavorano su moduli e modelli dati.
Che cos’è il campo readonly in Odoo
In Odoo un campo readonly mostra un valore ma non è modificabile dall’interfaccia utente: è visibile ma l’input è bloccato.
Nelle schede di dettaglio i campi readonly appaiono come testo semplice piuttosto che box editabili; visivamente possono sembrare attenuati o “piatti” rispetto ai campi attivi, a seconda del tema.
Il comportamento readonly può essere applicato su due livelli distinti all’interno del framework Odoo:
- Livello modello (Python/ORM): il campo è readonly in modo permanente su tutto il sistema
- Livello vista (XML): il campo è readonly solo in una vista specifica o in certe condizioni
La differenza è sostanziale: un campo impostato readonly nel modello non può essere scritto da alcuna vista, mentre un readonly a livello di vista limita solo la singola interfaccia e lascia la porta aperta ad altre viste o a scritture da codice server-side.
Readonly non è un nuovo tipo di campo, ma un attributo applicabile a qualsiasi tipo standard di Odoo: Char, Integer, Float, Many2one, Date e così via. Serve a gestire il comportamento dei campi a runtime.
Come funziona il readonly
Per capire davvero come si comportano i campi readonly è utile considerare sia il livello ORM (Python) sia il livello vista (XML).
Readonly a livello ORM
Nel modello Python puoi dichiarare un campo come readonly permanente, pratica comune per i campi calcolati il cui valore deriva da altri dati: nella definizione si usa readonly=True e l’interfaccia non permetterà mai la modifica diretta.
Questa modalità è parte dell’API dei campi di Odoo e si applica globalmente, indipendentemente dalla vista che mostra il dato.
Readonly basato sullo stato
Un uso diffusissimo è rendere i campi readonly in funzione dello stato del documento: ad esempio i moduli Sale, Purchase o Accounting bloccano i campi non appena il documento esce dalla bozza.
Nelle versioni precedenti di Odoo si usava l’attributo attrs in XML per combinare condizioni; nelle release più recenti la sintassi è stata semplificata e spesso si scrive l’espressione direttamente sull’elemento campo.
In entrambi i casi l’effetto è lo stesso: il campo è editabile in bozza e diventa bloccato quando il flusso lo richiede. È un principio base per qualsiasi configurazione di campi in Odoo.
Campi computati e readonly
I campi compute in Odoo sono di norma readonly perché il loro valore è calcolato automaticamente da altri campi e non deve essere sovrascritto manualmente.
Se vuoi che un campo computato sia memorizzato sul database per performance e ricerche, imposti anche store=True, così il valore viene salvato e può essere usato nei filtri senza ricalcolo continuo.
Rendere scrivibile un campo computato
Se serve permettere l’inserimento manuale su un campo computato, occorre definire anche un metodo inverse: questo insegna a Odoo come interpretare e propagare il valore scritto dall’utente. Senza inverse il campo resta readonly.
Esempi pratici aziendali
I campi readonly sono presenti in tutti i moduli Odoo; ecco alcuni casi pratici d’uso che mostrano il loro valore operativo.
1. CRM: bloccare dati di opportunità vinte o perse
Nel CRM i valori attesi e la data di chiusura sono modificabili durante il lavoro sul lead; una volta che l’opportunità è segnata come vinta o persa, quei campi vengono bloccati per mantenere una cronologia fedele.
Questo evita che si manipolino retroattivamente i numeri, falsando il pipeline e i report commerciali.
2. Vendite: proteggere le righe d’ordine confermate
Quando un ordine passa da Bozza a Confermato, le righe ordine diventano readonly: non si possono più cambiare prodotto, quantità o prezzo dopo l’invio della conferma cliente.
Eventuali modifiche devono passare per il reset a bozza o per note di variazione, lasciando traccia delle correzioni e impedendo interventi accidentali.
3. Magazzino: quantità validate bloccate
Nelle operazioni di magazzino, dopo la validazione di una consegna o ricevimento le quantità effettive vengono bloccate per tutelare la correttezza della valorizzazione e delle giacenze.
Consentire modifiche post-validazione rischierebbe di compromettere i livelli di inventario su più ubicazioni.
4. Contabilità: righe di giornale contabilizzate
In contabilità, dopo la registrazione definitiva di una scrittura, tutte le righe diventano readonly: spesso è anche un vincolo normativo in molti ordinamenti.
Consentire alterazioni dopo la contabilizzazione metterebbe a rischio l’affidabilità del bilancio e la conformità fiscale.
5. Produzione: dati di ordini di lavoro completati
Nel modulo Manufacturing, una volta chiuso l’ordine di lavoro, durata e quantità prodotte vengono bloccate per garantire registrazioni attendibili a fini di costing e analisi produttiva.
Creare o personalizzare un campo readonly
Per applicare readonly in Odoo hai due strade principali: usare Odoo Studio per una soluzione senza codice o agire direttamente su Python e XML per controlli più sofisticati.
Usare Odoo Studio
Odoo Studio permette di impostare readonly senza scrivere codice: è utile per amministratori e consulenti che devono applicare regole rapide e sicure.
- Apri Odoo Studio dal menu principale (icona a forma di matita)
- Vai alla vista modulo dove vuoi intervenire
- Seleziona il campo da modificare
- Nel pannello proprietà a destra attiva l’opzione "Readonly"
- Salva e chiudi Studio
Studio consente anche readonly condizionali tramite espressioni di dominio: per esempio puoi bloccare un campo solo quando lo stato assume un certo valore, senza una riga di codice.
L’approccio Studio è ideale per cambi rapidi e sicuri: le modifiche restano nel database e non vengono sovrascritte dagli aggiornamenti di modulo standard.
Usare Python per personalizzazioni tecniche
Gli sviluppatori impostano l’attributo readonly nella definizione del campo nel modello Python: è la pratica standard nell’API dei campi Odoo.
Oltre a readonly=True statico, puoi usare il parametro states per definire in quali stati del documento il campo è editabile o bloccato, offrendo flessibilità a livello di modello.
Questo metodo è utile quando aggiungi campi personalizzati a modelli esistenti e vuoi che la logica sia intrinseca al dato, invece di sparpagliarla nelle viste.
Usare attributi nella vista XML
Per il readonly a livello di vista si aggiunge l’attributo readonly direttamente all’elemento campo nel file XML della vista: è una pratica comune nello sviluppo Odoo.
Il vantaggio è che lo stesso campo può comportarsi in modo diverso a seconda della vista o delle condizioni, senza modificare la definizione Python sottostante. Utile quando vuoi limitare l’accesso in specifiche interfacce.
Nelle versioni più nuove di Odoo la sintassi per le condizioni inline è più chiara rispetto al vecchio attrs, ma entrambe le modalità sono valide a seconda della versione in uso.
Buone pratiche
Il successo nell’uso dei campi readonly sta nel livello scelto e nella motivazione: applicali dove servono realmente, seguendo linee guida pratiche consolidate.
1. Preferisci il readonly a livello di vista quando il contesto cambia
Se il campo deve essere bloccato solo in certe viste o stati, definiscilo nella vista: così rimane scrivibile da processi backend o integrazioni quando necessario.
2. Allinea le condizioni di readonly al ciclo di vita del documento
I blocchi dovrebbero scattare quando il documento raggiunge uno stato in cui ulteriori modifiche possono causare problemi; questa coerenza rende il sistema prevedibile per gli utenti.
3. Testa su diversi profili utente
Il comportamento readonly può interagire con i permessi: verifica sempre come appare una regola sia con un utente standard sia con un amministratore per evitare sorprese legate ai gruppi di accesso.
4. Combina readonly e required dove necessario
In form multistadio è comune che un campo sia obbligatorio in bozza e poi readonly. Puoi applicare entrambe le regole nella vista per garantire che il dato venga inserito prima della conferma.
5. Documenta la logica dei readonly
Aggiungi commenti nelle personalizzazioni per spiegare la ragione commerciale dietro un campo readonly: questo aiuta chi manterrà il codice in futuro a capire il contesto, non solo la tecnica.
6. Usa Studio per cambi rapidi e sicuri
Per casi semplici Studio è la scelta più rapida e a prova di aggiornamento; ricorri a Python solo quando le regole sono troppo complesse per essere espresse senza codice.
Errori ricorrenti
Anche chi lavora quotidianamente con Odoo inciampa spesso negli stessi problemi relativi ai campi readonly. Ecco gli errori più comuni da evitare.
Confondere il readonly di vista con una barriera di sicurezza
Un campo readonly impostato nella vista non impedisce scritture via API (XML-RPC), chiamate ORM in Python o azioni server. Se devi bloccare definitivamente le scritture, applica la limitazione a livello di modello o con regole di accesso, non solo nella vista.
Rendere permanente ciò che dovrebbe essere condizionale
Bloccare un campo a livello ORM quando invece servirebbe solo in certi casi impedisce anche i flussi di rettifica (es. riportare a bozza). Rifletti sul ciclo di vita completo prima di scegliere una soluzione permanente.
Dimenticare gli onchange
Un metodo onchange può comunque cercare di assegnare un valore a un campo readonly, generando comportamenti incoerenti o errori. Verifica che la logica di onchange tenga conto dei campi bloccati.
Non applicare il readonly in modo coerente su tutte le viste
Un campo bloccato nel form potrebbe restare modificabile in list o kanban se quegli elementi non ricevono la stessa regola. Controlla tutte le viste dove il campo è presente.
Effetti collaterali nell’ereditarietà dei modelli standard
Se erediti un modello standard e imposti readonly=True su un campo esistente, questa modifica si rifletterà in tutte le viste che lo mostrano, comprese quelle standard: assicurati che sia voluto e che non rompa altri comportamenti.
Conclusione
I campi readonly sono uno strumento fondamentale per guidare gli utenti, mantenere integrazione dei dati e applicare regole di business senza puntare tutto sulla formazione.
La vera abilità sta nel decidere quando usare il blocco a livello di vista o a livello di modello e nel farlo combaciare con il modo reale in cui il team lavora. Una buona configurazione è quella che protegge il dato nel momento giusto del flusso documentale.
Che tu li imposti con Studio per rapidità o definisca la logica in Python e XML in un progetto di sviluppo, lo scopo resta lo stesso: mostrare i dati senza permettere modifiche non desiderate.
Potranno non essere l’argomento più glamour delle personalizzazioni Odoo, ma sono tra le modifiche che portano il maggiore impatto operativo.
Da Dasolo supportiamo aziende nell’implementazione, personalizzazione e ottimizzazione di Odoo in tutti i moduli e settori. Se hai bisogno di aiuto per configurare campi, modellare processi o migliorare il tuo schema dati, il nostro team è a disposizione. Contattaci e raccontaci il tuo progetto.