Introduktion
Varje formulär i Odoo har fält. Vissa behöver fyllas i manuellt varje gång. Men många fält kan ges ett rimligt standardvärde så att användarna börjar med något användbart redan på plats. Mekanismen för standardvärden i Odoo är enkel vid första anblicken men har flera lager som är värda att förstå, särskilt när du konfigurerar eller anpassar formulär för ditt team.
Oavsett om du är en affärsanvändare som justerar ett fält genom Odoo Studio eller en utvecklare som arbetar med en Odoo-fälthandledning, sparar kunskapen om hur standardvärden fungerar tid och förhindrar den typ av tysta konfigurationsmisstag som är svåra att diagnostisera senare.
Denna guide täcker vad standardvärden är i Odoo, hur de fungerar på ORM-nivå, när man ska använda statiska kontra dynamiska standardvärden, och hur man konfigurerar dem genom Odoo Studio eller Python-kod.
Vad är standardvärdet i Odoo
I Odoo ORM är ett standardvärde det som tilldelas ett fält när en ny post skapas, innan användaren fyller i något. Det är inte en begränsning. Användaren kan ändra det fritt. Det är helt enkelt en utgångspunkt som gör formuläret mer användbart direkt ur lådan.
Parametern default är tillgänglig på praktiskt taget varje fälttyp i Odoo-ramverket: Char, Integer, Float, Boolean, Date, Many2one, Selection och andra. Det kan vara ett enkelt värde, en Python-lambda eller en metodreferens. Alla dessa räknas som giltiga standardmekanismer beroende på användningsfallet.
I Odoo Studio visas standardvärden i fältets egenskapspanel som en enkel inmatning. Affärsanvändare kan ställa in ett statiskt standardvärde utan att skriva någon kod. Detta gör det till ett av de mest tillgängliga sätten att förbättra datakonsistensen med hjälp av Odoo Studio-fält, utan att kräva utvecklarinvolvering.
På databasnivå lagras standardvärden inte i fältkolumnen själv. De finns antingen i Python-modellens definition eller i ir.default-poster i databasen, beroende på hur de konfigurerades. När en ny post skapas läser Odoo dessa standardvärden och förfyller formuläret innan användaren ser det.
Hur standardvärdet fungerar
När en användare öppnar ett nytt formulär i Odoo anropar ramverket default_get() på modellen. Denna metod samlar alla fältstandarder och returnerar en ordbok som mappar fältnamn till deras standardvärden. Formuläret förfyller sedan dessa fält innan användaren gör något.
Det finns fyra huvudtyper av standardvärden i Odoo, var och en täcker ett annat scenario.
Statiska standarder
Ett fast värde hårdkodat i fältdefinitionen eller inställt genom Studio. Till exempel, att ställa in ett Boolean-fält till True som standard, eller ett Selection-fält till 'draft'. Dessa är den enklaste typen och täcker de flesta vardagliga användningsfallen i en Odoo-datamodell.
Dynamiska standarder via Lambda eller metod
En Python-funktion eller lambda som körs vid postskapandet. Detta möjliggör standarder som beror på det aktuella datumet, den inloggade användaren eller någon annan tillgänglig kontext. Till exempel, att ställa in den aktuella användaren som standardansvarig person, eller att använda idag som standarddatum för dokumentet.
Här är hur statiska och dynamiska standarder ser ut i en Python-modelldefinition, enligt den standardiserade Odoo-utvecklingsmönstret:
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Statisk standard
x_priority_level = fields.Selection(
[('low', 'Low'), ('medium', 'Medium'), ('high', 'High')],
string='Priority Level',
default='medium',
)
# Dynamisk standard: aktuell användare
x_assigned_by = fields.Many2one(
'res.users',
string='Assigned By',
default=lambda self: self.env.user,
)
# Dynamisk standard: dagens datum
x_expected_date = fields.Date(
string='Expected Close Date',
default=lambda self: fields.Date.today(),
)
Kontextbaserade standarder
Värden som passerar genom åtgärdskontexten med hjälp av default_field_name konventionen. När du klickar på Skapa från en relaterad post, passerar Odoo ofta kontextvärden som blir standard för relationella fält. Till exempel, när du öppnar en ny uppgift från ett projekt ställs projektfältet automatiskt in. Detta är en del av hur navigeringsflöden fungerar i Odoo-ramverket och det drivs helt av kontextnycklar som vilken utvecklare eller avancerad användare som helst kan konfigurera.
Användarnivåstandarder via ir.default
Odoo stöder också användarspecifika standarder genom ir.default poster. En administratör kan konfigurera en personlig standard för ett givet fält på en given modell. När den användaren skapar en ny post, får deras personliga standard företräde framför standarden på modellnivå. Detta är användbart i miljöer med flera användare där olika teammedlemmar har olika arbetspreferenser, och det är en av de mindre kända funktionerna i odoo orm.
Prioritetsordning
När flera standardkällor finns för samma fält, löser Odoo dem i denna ordning: användarspecifik ir.default först, sedan företagsnivå ir.default, och slutligen standarden som definieras i Python-modellen. Kontextbaserade standarder som passerar vid körning åsidosätter också standarder på modellnivå. Att känna till denna ordning hjälper dig att förstå varför ett fält kanske inte visar det värde du förväntar dig när du öppnar ett nytt formulär.
Affärsanvändningsfall
Standardvärden förekommer i praktiskt taget varje modul i en Odoo-implementation. Här är fem praktiska exempel från verkliga affärsarbetsflöden.
CRM: Standard Säljare på Nya Leads
När en säljare skapar ett nytt lead eller möjlighet, ställs fältet Ansvarig in på den aktuella användaren som standard. Detta förhindrar att varje lead börjar utan tilldelning och kräver manuell attribuering. Standarden ställs in med lambda self: self.env.user i modellens definition. I praktiken förbättrar denna lilla detalj CRM-acceptansen eftersom användarna omedelbart ser sina egna leads utan något extra steg.
Försäljning: Standard Betalningsvillkor på Order
När en försäljningsorder skapas för en kund, ställs fält som prislista och betalningsvillkor in som standard baserat på kundens partnerkonfiguration. En kund som är inställd med Net 30 betalningsvillkor kommer att ha dessa villkor förifyllda på varje ny order. Detta minskar manuella urvalsfel och säkerställer att de villkor som avtalats med varje kund tillämpas konsekvent, även när olika säljare skapar order.
Lager: Standard Platser på Överföringar
När du skapar en intern överföring eller lagerjustering, ställs fälten för käll- och destinationsplats in som standard till de platser som konfigurerats i lagerinställningarna. Lagerpersonal som alltid arbetar inom samma zon kommer att hitta den korrekta platsen redan vald när de öppnar en ny överföring. Detta sparar klick och minskar risken för att välja fel plats under tidspress.
Bokföring: Standardjournal för poster
När en användare skapar en ny kundfaktura eller leverantörsfaktura, ställer Odoo in den lämpliga journalen baserat på posttyp och företagskonfiguration. En revisor som öppnar en ny leverantörsfaktura behöver inte manuellt välja inköpsjournalen varje gång. Standarden löses dynamiskt från företagsinställningarna, inte från ett hårdkodat värde, vilket innebär att den förblir korrekt även om journaler omkonfigureras senare.
Projekt: Standardstadium för nya uppgifter
När en ny uppgift skapas inom ett projekt, börjar den i det första stadiet av den projektets kanban-konfiguration. Om uppgiften skapas genom att klicka på en knapp på en specifik projektpost, fylls kontextbaserade standardvärden också i automatiskt för projektet och ibland för den tilldelade. Team som använder Odoo för projektledning drar nytta av dessa standarder eftersom det håller nya uppgifter på rätt plats från det ögonblick de skapas, utan någon manuell inställning.
Skapa eller anpassa standardvärden
Det finns tre huvudsakliga tillvägagångssätt för att ställa in standardvärden i Odoo, som sträcker sig från en kodfri klick-genom i Studio till fullständig Python-kontroll i en anpassad modul.
Använda Odoo Studio (Ingen kod)
Odoo Studio erbjuder ett visuellt gränssnitt för att ställa in standardvärden på vilket fält som helst i dina formulär. För att ställa in en standard genom Studio:
- Öppna Studio-gränssnittet på det formulär du vill ändra
- Klicka på det fält du vill konfigurera
- I fältets egenskapspanel till höger, hitta inmatningen för Standardvärde
- Ange eller välj det värde du vill ha som startstandard
- Spara och avsluta Studio
Studio lagrar denna konfiguration som en ir.default post i databasen. Den tillämpas företagsomfattande om inte en administratör specificerar en användarnivåbegränsning. Denna metod fungerar bra för statiska standardvärden på urval, Boolean, Char och Integer fält. För Many2one-fält låter Studio dig välja en befintlig post från en rullgardinsmeny. Det är en av de mest praktiska användningarna av att skapa fält i odoo utan att skriva någon kod.
En sak att ha i åtanke: att ändra standarden genom Studio efter att användare redan har skapat poster uppdaterar inte dessa befintliga poster. Den nya standarden gäller endast för poster som skapats efter ändringen.
Använda Python i teknisk anpassning
För teknisk odoo-anpassning sätts standarder direkt i fältdefinitionen inuti Python-modellen. Detta ger full kontroll över statiska värden, dynamiska lambdas och metodbaserade standarder. Det är den föredragna metoden i alla odoo-utvecklingsscenarier där standarden beror på körningens information som den aktuella användaren, dagens datum eller företagskonfiguration.
Här är ett exempel som visar flera typer av standarder som du kan lägga till i en anpassad modul:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Statisk Boolean-standard
x_requires_review = fields.Boolean(
string='Requires Review',
default=False,
)
# Statisk urvalsstandard
x_delivery_preference = fields.Selection(
[('standard', 'Standard'), ('express', 'Express')],
string='Delivery Preference',
default='standard',
)
# Dynamisk standard med hjälp av en metod
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,
)
Detta mönster följer den standardiserade odoo python-fältkonventionen och fungerar över alla odoo-fälttyper. Den metodbaserade standarden är särskilt användbar när logiken är mer komplex än ett enda lambda-uttryck.
Använda ir.default-poster programmässigt
Du kan också skapa eller uppdatera ir.default poster genom Odoo XML-RPC API eller inom en moduldatafil. Detta är användbart när man skickar en standardkonfiguration som en del av installationen av en anpassad modul. Modellen ir.default accepterar ett modellnamn, ett fältnamn, ett värde och valfritt ett företag eller en användare för att avgränsa standarden.
Denna metod är mindre vanlig i den dagliga utvecklingen men dyker upp när man bygger installabla Odoo-moduler som behöver konfigurera rimliga standarder som en del av sin installationsrutin.
Bästa praxis för standardvärden i Odoo
Ställ in standarder för obligatoriska fält
Om ett fält är obligatoriskt, ge det en rimlig standard där det är möjligt. Detta minskar friktion och förhindrar spara-fel när användare försöker skicka en ny post utan att inse att ett fält är obligatoriskt. Att kombinera required=True med en praktisk standard är ett bra mönster över odoo-datamodellen.
Använd Lambdas för Datumstandarder
Hårdkoda aldrig ett datum som ett standardvärde. Använd lambda self: fields.Date.today() så att standarden alltid är det aktuella datumet vid den tidpunkt då posten skapas. Ett hårdkodat datum skulle vara fel för alla poster som skapats efter att koden skrevs, vilket i praktiken innebär att det är fel nästan omedelbart.
Håll Standardlogik Lättviktig
Standardfunktioner körs vid postskapande, vilket innebär att de körs varje gång en användare öppnar ett nytt formulär. Undvik att göra databasfrågor, anropa externa API:er eller köra tunga beräkningar inuti standardmetoder. Håll dem snabba och enkla. Om du behöver något mer involverat, överväg att använda ett onchange eller ett beräknat fält som utlöses av ett annat fält istället.
Använd Kontextstandarder för Navigeringsflöden
När du bygger anpassade åtgärder eller smarta knappar som öppnar ett nytt formulär, skicka default_field_name-värden genom åtgärdskontexten istället för att förlita dig på statiska modellstandarder. Detta är exakt hur inbyggda Odoo-knappar fungerar och håller din Odoo-anpassning i linje med ramverkskonventionerna.
Testa Standarder med Flera Användarprofiler
Dynamiska standarder som refererar till self.env.user eller self.env.company beter sig olika beroende på vem som är inloggad. Testa alltid med minst två olika användarkonton och med olika företagskonfigurationer om du kör en flerföretagsuppsättning. Vad som fungerar för en administratör kan ge oväntade resultat för en vanlig användare.
Vanliga fallgropar
Använda ett Muterbart Objekt som Standard
Detta är det klassiska Python-felet och det gäller även Odoo-utveckling. Skriv aldrig default=[] eller default={} för ett fält. Python delar samma lista eller ordboksobjekt över alla instanser, vilket orsakar att data läcker mellan poster på oväntade sätt. Använd istället en lambda: default=lambda self: []. Detta skapar ett nytt objekt varje gång en post initieras.
Standarder Utlöser Inte onchange
Att ställa in ett standardvärde utlöser inte onchange-metoder. Om ditt formulär har en onchange på ett fält som normalt utlöser uppdateringar på andra fält, kringgår standarden helt den kedjereaktionen. Användare kommer att se det förifyllda värdet men inga av de nedströms effekterna som onchange normalt skulle producera. Om du behöver att onchange ska köras vid initialisering, måste du anropa det uttryckligen i en anpassad default_get-överskrivning eller hantera logiken på ett annat sätt.
Motstridiga standardvärden från ir.default och modelldefinition
Om du ställer in ett standardvärde både i Python och genom Studio eller en ir.default-post, löser Odoo dem med en prioritetsordning. Posten ir.default har företräde framför standardvärdet på modellnivå i Python. Detta är en vanlig källa till förvirring när man felsöker oväntade fältvärden, särskilt efter en konfigurationsändring i Studio som tyst åsidosätter något som en utvecklare har ställt in i koden.
Att anta ett standardvärde innebär ett obligatoriskt värde
Ett fält med ett standardvärde är inte automatiskt obligatoriskt. Om användaren rensar fältet kommer det att sparas tomt. Lita inte enbart på standardvärdet för att säkerställa datakompletthet. Om du alltid behöver ett värde i det fältet, kombinera standardvärdet med required=True.
Hårdkodning av företags- eller användarpost-ID:n
Ett standardvärde som default=1 som refererar till en användare eller ett företag med dess databas-ID är ömtåligt. Det kommer att gå sönder i alla miljöer där den posten har ett annat ID, vilket är praktiskt taget varje produktionsdatabas som inte har ställts in identiskt med utvecklingsmiljön. Använd alltid dynamiska referenser: lambda self: self.env.company.id eller lambda self: self.env.ref('module.xml_id').id.
Slutsats
Standardvärden är en liten men kraftfull funktion i Odoo-datamodellen. De minskar manuell datainmatning, vägleder användare mot konsekventa val och gör formulär lättare att använda för alla i teamet. Oavsett om du konfigurerar dem genom Odoo Studio för en snabb kodfri ändring eller definierar dem i Python som en del av en teknisk anpassning, hjälper förståelsen av hur standardvärden fungerar dig att bygga bättre Odoo-implementationer.
De viktigaste punkterna att ha i åtanke: standardvärden körs endast vid postskapande, inte kontinuerligt. De utlöser inte onchange-metoder. Flera standardkällor följer en definierad prioritetsordning. Och föränderliga objekt som listor eller ordböcker bör alltid omslutas i en lambda när de används som fältstandarder.
Att få standardvärden rätt är ofta skillnaden mellan ett formulär som känns intuitivt och ett som skapar friktion för användare varje gång de behöver skapa en ny post. Det är en liten investering som ger avkastning varje dag.
På Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo för att passa deras specifika arbetsflöden. Om du behöver hjälp med att konfigurera fältstandarder, bygga anpassade fält eller designa en Odoo-datamodell som faktiskt fungerar för ditt team, hjälper vi gärna till. Kontakta oss och låt oss prata om din Odoo-implementation.