Hoppa till innehåll

Kontextfält i Odoo: En Praktisk Guide

Förstå hur kontext formar fältbeteende, standardvärden och postfiltrering över Odoo ORM
6 mars 2026 av
Kontextfält i Odoo: En Praktisk Guide
Dasolo
| Inga kommentarer ännu

Om du har spenderat tid på att arbeta med Odoo ORM eller anpassa vyer, har du nästan säkert sett ordet kontext dyka upp. Det förekommer i fältdefinitioner, i XML-vyattribut och genom hela Odoos Python-kod. Ändå förblir det för många utvecklare och konsulter en av de saker som bara fungerar tills det inte gör det.


Att förstå kontextfält i Odoo är inte bara en akademisk övning. Det påverkar direkt hur din datamodell beter sig, hur formulär förfyller värden, hur poster filtreras och hur beräknade fält bestämmer vad som ska returneras. Oavsett om du gör en enkel odoo-anpassning eller bygger en fullständig modul, sparar rätt kontext mycket tid vid felsökning.


Denna guide bryter ner vad kontext är, hur den flödar genom Odoo-ramverket och hur du använder den med självförtroende i verkliga projekt.

Vad är kontext i Odoo


Kontext i Odoo är en Python-dictionary som färdas tillsammans med varje begäran, varje metodanrop och varje postoperation. Det är inte en fälttyp i traditionell mening. Du kommer inte att hitta fields.Context() i Odoo ORM. Istället är kontext en mekanism som modifierar hur fält beter sig.


Tänk på det som en uppsättning osynliga instruktioner som skickas med dina data. Dessa instruktioner berättar för Odoo saker som: förfyll detta fält med ett standardvärde, visa arkiverade poster också, beräkna detta fält med ett annat språk, eller tillämpa detta domän när du visar den relaterade postväljaren.


Var visas kontext

Du kommer att stöta på kontext på tre huvudsakliga ställen i Odoo datamodellen:

  • På fältdefinitioner i Python: Parametern context på relationella fält som Many2one, One2many och Many2many.
  • I XML-vy-attribut: Attributet context<field>-taggar i formulär, listor och kanban-vyer.
  • I ORM-miljön: Tillgänglig via self.env.context i Python-kod och kan modifieras med self.with_context(key=value).

I alla tre fallen gör kontext samma grundläggande sak: den bär extra information som formar hur ett fält eller en post beter sig vid körning.

Hur kontext fungerar i Odoo-datamodellen


Kontext flödar genom Odoo-begärans livscykel från det ögonblick en användare öppnar ett formulär till det ögonblick en post sparas. Här är hur de viktigaste mekanismerna fungerar i praktiken.


Standardvärden med default_*

Ett av de mest använda kontextmönstren är default_field_name. När du skickar en nyckel som börjar med default_, använder Odoo den för att förfylla ett fält när en ny post skapas.

Till exempel, om en knapp öppnar ett nytt försäljningsorderformulär och skickar {"default_partner_id": 42} i kontexten, kommer kundfältet redan att vara inställt på partnern med ID 42. Användaren ser ett förfyllt formulär utan att någon ytterligare Python-logik krävs.


Detta mönster används flitigt i Odoo-utveckling för att skapa smarta navigeringsflöden mellan poster.


Attributet context på relationella fält

När du definierar ett Many2one, One2many eller Many2many-fält i Python kan du skicka en context-parameter. Denna kontext tillämpas när det relationella fältet laddar eller skapar poster genom sin popup eller rullgardinsmeny.


Ett praktiskt exempel: ett Many2one som pekar på res.partner med context={"default_is_company": True} innebär att om användaren skapar en ny partner direkt från det fältet kommer Är ett företag-rutan att vara förvald. Du uppmuntrar användaren att ange rätt data utan att tvinga fram det.


Kontext i XML-vyer

I vy-XML fungerar context-attributet på ett fälttag på samma sätt, men det kan vara dynamiskt. Du kan referera till andra fältvärden med hjälp av Odoo:s utvärderingssyntax:


Detta gör att du kan bygga intelligenta formulär där en fälts kontext beror på värdet av ett annat. Det är en kärnteknik i odoo-anpassning för att skapa smarta relationella beteenden utan att skriva extra Python-kod.


Läsa och modifiera kontext i Python

Inuti vilken modellmetod som helst kan du läsa den aktuella kontexten med self.env.context. Detta ger dig hela ordboken som den var när metoden anropades.


För att köra kod med en modifierad kontext använder du self.with_context(key=value). Detta returnerar en ny postuppsättning som bär den uppdaterade kontexten utan att ändra den ursprungliga. Det är ett rent, icke-destruktivt mönster som passar bra med Odoo:s funktionella programmeringsstil.


Vanliga inbyggda kontextnycklar

Odoo själv använder flera reserverade kontextnycklar som utlöser specifikt beteende över Odoo-ramverket:


  • lang: Ändrar språket som används för översatta fältvärden.
  • active_test: Sätts till False för att inkludera arkiverade poster i sökresultaten.
  • no_recompute: Förhindrar att lagrade beräknade fält beräknas om.
  • mail_notrack: Inaktiverar chatter-spårning för en skrivoperation.
  • allowed_company_ids: Kontrollerar synligheten av poster i flera företag.
  • bin_size: Returnerar filstorlekar istället för binärt innehåll för binära fält.

Att känna till dessa inbyggda nycklar är en del av varje solid odoo utvecklarguide eftersom de låter dig kontrollera beteende utan att skriva anpassad kod.

Affärsanvändningsfall


Kontextfält är inte bara ett utvecklarverktyg. De löser verkliga arbetsflödesproblem inom olika affärsområden. Här är fem exempel från vanliga Odoo-implementationer.


1. CRM: Förifyllning av försäljningsteamet på nya leads

En försäljningschef har en kanbanvy filtrerad till sitt team. När hon klickar på "Ny" förväntar hon sig att leadet automatiskt ska tilldelas hennes team. Genom att skicka default_team_id i åtgärdens kontext, förifylls teamfältet i det ögonblick formuläret öppnas. Ingen manuell val behövs, inga felaktiga teamtilldelningar.


2. Försäljning: Förinställning av prislistan baserat på kundsegmentet

När en försäljare skapar en offert från en specifik kundkategori, kan prislistafältet förinställas med hjälp av kontext. Kontexten bär default_pricelist_id baserat på kategorin, vilket vägleder försäljaren till rätt prissättning utan att begränsa deras val.


3. Lager: Filtrering av platser i överföringsformulär

I lagerverksamhet kan källplatsfältet i ett överföringsformulär använda kontext för att begränsa rullgardinsmenyn till endast platser som tillhör ett specifikt lager. Detta görs genom att skicka en domän via kontext på Many2one-fältet, vilket håller gränssnittet rent och minskar fel i flerlageruppsättningar.


4. Bokföring: Fler språk på fakturalinjer

När fakturor genereras för internationella kunder tvingar lang-kontextnyckeln översatta beskrivningar att visas på kundens språk. En faktura som skickas till en fransk kund kommer att visa produktnamn och beskrivningar på franska, även om den interna databasen lagrar allt på engelska.


5. Anpassade modeller: Visa arkiverade produkter i en särskild vy

Ett operationsteam behöver granska nedlagda produkter tillsammans med aktiva. En anpassad listvy skickar active_test: False i sin åtgärdskontext. Utan att ändra någon Python-kod visas alla produkter, inklusive arkiverade, i den specifika vyn, medan resten av gränssnittet förblir opåverkat.

Skapa och anpassa kontext på fält


Det finns två vägar för att lägga till eller ändra kontext på fält i Odoo: att använda Odoo Studio för kodfria justeringar, eller att skriva Python och XML för full teknisk kontroll. Detta är en nyckelkomponent i varje odoo teknisk handledning om fältbeteende.


Använda Odoo Studio

Odoo Studio gör det möjligt för dig att ändra vissa fältens egenskaper utan att skriva kod. För relationella fält exponerar Studio en konfigurationsalternativ för kontext där du kan ställa in standardvärden som kommer att tillämpas när en ny post skapas från det fältet.


Detta är användbart för enkla fall: förifyllning av ett företag, ett team, en kategori eller en ansvarig användare. Begränsningen är att Studios kontextstöd avsiktligt är förenklat. För dynamisk kontext som refererar till andra fältvärden måste du gå den tekniska vägen.


När du använder odoo studio-fält, kom ihåg att den kontext du ställer in lagras direkt på vyn. Om du senare skapar en teknisk anpassning på samma vy måste du ta hänsyn till befintlig kontext definierad av Studio för att undvika konflikter.


Definiera kontext på fält i Python

I en anpassad modul läggs kontext direkt till fältdefinitionen. För ett Many2one-fält accepterar context-parametern en statisk ordbok:


Denna statiska kontext tillämpas varje gång fältet laddar eller skapar relaterade poster. Den ändras inte baserat på andra fältvärden. För en kontext som reagerar på det aktuella postens tillstånd flyttar du logiken till vy-nivån istället.


Definiera kontext i XML-vyer

I vy-XML accepterar kontextattributet en sträng som Odoo utvärderar vid körning. Du kan referera till fältvärden, det aktuella användar-ID:t (uid), det aktiva post-ID:t (active_id) och andra variabler:

Detta gör kontext på vy-nivå mycket mer flexibelt än kontext på fält-nivå. Det är den standardmetod som används i odoo-ramverket för att bygga formulär där ett fälts beteende beror på ett annat. Detta är också hur du skapar fält odoo beteenden som känns inhemska och intuitiva för slutanvändare.


Överföra kontext via fönsteråtgärder

Kontext kan också ställas in på ir.actions.act_window poster. Detta är hur menyer och knappar överför kontext till de vyer de öppnar. Ett actions context-fält innehåller ordboken som slås samman med sessionskontexten när vyn laddas.


Detta är det renaste sättet att hantera användningsfall som CRM-försäljningsteamexemplet ovan. Kontexten lever på åtgärden, inte på fältdefinitionen, vilket innebär att du kan ha olika standarder i olika navigeringskontexter utan att röra modellkoden.

Bästa praxis


Att arbeta med kontext i Odoo blir mycket smidigare när du följer några konsekventa vanor. Dessa gäller oavsett om du bygger en modul eller gör en snabb odoo-anpassning.


  • Använd kontext för förslag, inte tvång. Kontextdrivna standarder vägleder användare utan att blockera dem. Om du behöver en hård begränsning, använd istället ett domän eller en onchange-metod.
  • Placera dynamisk kontext i vyer, inte i fältdefinitioner. Kontext på fält-nivå är statisk. Om kontexten behöver återspegla det aktuella postens tillstånd, är vy-XML rätt plats för det.
  • Använd with_context() istället för att modifiera env.context direkt. Odoos miljö är utformad för att vara oföränderlig inom ett anrop. Skapa alltid en ny miljö med with_context() istället för att försöka mutera den befintliga.
  • Var avsiktlig med vad du passerar i kontext. Kontextnycklar ackumuleras när de färdas genom anropsstacken. Att skicka onödiga nycklar kan leda till oväntat beteende i metoder som kontrollerar dessa nycklar.
  • Använd kontext för att skicka flaggor för villkorlig logik. Ett vanligt mönster är att skicka en boolesk flagga som from_wizard: True i kontexten, och sedan kontrollera den i en beräknings- eller onchange-metod för att tillämpa olika beteenden. Detta undviker att förorena modellfält med arbetsflödesstatus.
  • Dokumentera anpassade kontextnycklar i din modul. Kontextnycklar är osynliga om du inte vet att du ska leta efter dem. Lägg till en kommentar eller docstring som förklarar eventuella anpassade kontextnycklar som din modul läser eller sätter. Detta lönar sig när du eller en kollega återvänder till koden senare.

Vanliga fallgropar


Kontextrelaterade buggar kan vara svåra att diagnostisera eftersom kontexten är osynlig i användargränssnittet. Dessa är de misstag som oftast dyker upp i verkliga projekt.


Att behandla default_* som obligatoriska värden

Ett standardvärde som sätts via kontext tillämpas endast när en post skapas genom ett formulär. Om du skapar poster programmässigt via ORM utan att skicka den relevanta kontexten, kommer standardvärdet inte att tillämpas. Utvecklare förväntar sig ibland att kontextstandarder ska bete sig som Python-nivå default-parametrar på fält. Det gör de inte. Skicka alltid kontexten explicit när du skapar poster i kod om dessa standarder är viktiga.


Att mutera kontextordboken direkt

Kontextordboken delas över anropsstacken. Om du ändrar self.env.context direkt kan du påverka annan kod som körs i samma transaktion på oväntade sätt. Den korrekta mönstret är alltid self.with_context(new_key=value), vilket skapar en ny miljö med en kopia av kontexten plus dina ändringar.


Att skicka för mycket i kontext

Varje nyckel du lägger till i kontexten färdas genom hela anropskedjan. Vissa Odoo-metoder kontrollerar specifika kontextnycklar och ändrar sitt beteende därefter. Att skicka oväntade nycklar kan oavsiktligt utlösa dessa grenar. Håll kontexten smal och specifik för vad den omedelbara operationen behöver.


Att glömma active_test när man söker i arkiverade poster

Som standard filtrerar Odoos search() och search_read() metoder bort arkiverade poster (där active = False). Om din kod behöver arbeta med arkiverade poster måste du uttryckligen skicka active_test: False i kontexten. Att glömma detta är en mycket vanlig bugg i anpassningar av lager och produktledning.


Konflikter i kontext mellan Studio och anpassad kod

Om Odoo Studio har ställt in kontext på ett fält i en vy, och du senare lägger till en teknisk vyutvidgning som riktar sig mot samma fält, kan båda kontexterna komma i konflikt eller en kan åsidosätta den andra beroende på XML-sammanslagningsordningen. Inspektera alltid befintlig kontext på ett fält innan du lägger till din egen via en vyarv. Detta är ett särskilt vanligt problem när man blandar odoo studio-fält med modulbaserade anpassningar.

Slutsats


Kontext är en av de mekanismer i Odoo som tyst gör mycket arbete. När du väl förstår hur den flödar genom fältdefinitioner, vyattribut och ORM-miljön, får du en mycket finare nivå av kontroll över hur din datamodell beter sig.


De viktigaste punkterna är enkla. Använd default_* nycklar för att vägleda användare mot korrekt data utan att tvinga dem. Sätt dynamisk kontext i vyer snarare än fältdefinitioner. Använd alltid with_context() istället för att modifiera kontexten på plats. Och håll din kontext smal så att den inte oavsiktligt stör andra delar av systemet.

Oavsett om du arbetar med en odoo fälthandledning, bygger en anpassad modul eller felsöker ett fält som beter sig konstigt, kommer förståelsen av kontext alltid att vara en del av svaret.


Dasolo hjälper vi företag att implementera, anpassa och optimera Odoo för att passa deras verkliga affärsarbetsflöden. Om du arbetar med en anpassning där kontext är involverad och du är osäker på om du har det rätt, eller om du bara vill diskutera din Odoo-implementering, hjälper vi gärna till.

Kontakta vårt team via kontakt sidan och låt oss veta vad du bygger. Vi arbetar med företag av alla storlekar för att få Odoo att fungera som det ska.

Kontextfält i Odoo: En Praktisk Guide
Dasolo 6 mars 2026
Dela detta inlägg
Logga in att lämna en kommentar