Hvis du har arbejdet med Odoo — enten ved at tilpasse views eller bygge moduler — har du sikkert mødt begrebet kontekst. Det dukker op flere steder: på felter i modellen, som XML-atributter i views og i Python-koden. For mange virker det som en usynlig hjælper, der fungerer fint indtil det pludselig ikke gør det længere.
Kontekst er ikke bare teori: den bestemmer, hvordan formularer bliver præ-udfyldt, hvilke poster der vises, og hvordan beregnede felter udregner deres værdier. Forkert forstået kontekst fører ofte til mærkelige fejl — korrekt brug af kontekst sparer tid og frustration i enhver Odoo-tilpasning eller moduludvikling.
Denne guide forklarer, hvad kontekst er, hvordan den bevæger sig gennem Odoo-frameworket, og hvordan du bruger den sikkert i rigtige projekter.
Hvad betyder kontekst i Odoo
I Odoo er kontekst en simpel Python-ordbog (dictionary), der følger med hver operation. Det er ikke et felttypefelt i ORM’en — du finder ikke noget som fields.Context(). I stedet er kontekst et sæt ekstra parametre, der ændrer, hvordan Odoo håndterer data ved runtime.
Forestil dig kontekst som små, skjulte instrukser, der rejser sammen med en handling. De kan sige: forudfyld dette felt, vis arkiverede poster, brug et andet sprog ved oversættelse, eller anvend et bestemt filter i en relationstjekker.
Hvor møder du kontekst?
Kontekst dukker op tre steder i Odoo’s datamodel:
- I Python-feltdefinitioner: Relationale felter (Many2one, One2many, Many2many) kan få en
context-parameter. - I XML-views:
context-atributtet på<field>-tags i formularer, lister og kanban-visninger. - I ORM-miljøet: Tilgængelig via
self.env.contexti Python, og kan ændres midlertidigt medself.with_context(key=value).
I alle tre tilfælde gør kontekst det samme: den transporterer ekstra information, der styrer, hvordan et felt eller en post opfører sig, når brugeren interagerer med systemet.
Hvordan kontekst påvirker Odoo’s datamodel
Kontekstens rejse gennem en brugerhandling strækker sig fra åbningen af en formular til den endelige gemning af posten. Her er de centrale mekanismer i praksis.
Standardværdier via default_*
Et af de mest almindelige mønstre er nøgler, der starter med default_. Når du sender sådan en nøgle i konteksten, bruges den til at forudfylde et felt ved oprettelse af nye poster.
Eksempelvis: hvis en handling åbner en ny salgsordre og sender {"default_partner_id": 42}, vil kunde-feltet være udfyldt med partner 42. Brugeren får en formular, der allerede er sat op korrekt uden ekstra Python-kode.
Dette mønster er ofte brugt i Odoo-udvikling for at skabe smidige navigationsflow mellem poster.
Context-attributten på relationelle felter
Når du definerer en Many2one/One2many/Many2many, kan du give en context-parameter. Den anvendes hver gang relationen får lov at oprette eller indlæse poster via popups eller dropdowns.
Praktisk illustration: en Many2one til res.partner med context={"default_is_company": True} betyder, at hvis brugeren opretter en ny partner fra feltet, vil 'Er virksomhed'-checkboxen være forudkrydset. Du guider brugeren i den rigtige retning uden at låse valget.
Kontekst i XML-views
I view-XML fungerer context-atributtet tilsvarende, men det kan være dynamisk. Du kan referere til andre felters værdier via Odoos evaluerings-syntaks.
Det betyder, at du kan lave intelligente formularer, hvor ét felts kontekst afhænger af et andet. Det er et centralt værktøj i Odoo-tilpasninger, når du vil styre relationers adfærd uden at skrive ekstra Python.
Læsning og ændring af kontekst i Python
I enhver modelmetode kan du læse den aktuelle kontekst med self.env.context. Det returnerer hele ordbogen, som den så ud ved kaldet.
Hvis du vil køre kode med ændret kontekst, bruger du self.with_context(key=value). Det giver et nyt recordset med opdateret kontekst uden at ændre det oprindelige — en sikker, ikke-destruktiv måde at arbejde på, som passer godt til Odoos funktionsorienterede stil.
Indbyggede kontekstnøgler du bør kende
Odoo har flere reserverede kontekstnøgler, der udløser bestemt adfærd i frameworket:
lang: Skifter sproget for oversatte felter.active_test: Sæt tilFalsefor at inkludere arkiverede poster i søgninger.no_recompute: Forhindrer genberegning af gemte computed-felter.mail_notrack: Slår chatter-tracking fra for en write-operation.allowed_company_ids: Styrer multi-company synlighed af poster.bin_size: Returnerer filstørrelser i stedet for binært indhold for Binary-felter.
At kende disse indbyggede nøgler er basisviden i enhver praktisk Odoo-udviklerguide, fordi de lader dig styre adfærd uden at skrive særskilt kode.
Praktiske forretningsscenarier
Kontekst er ikke kun for udviklere — den løser konkrete arbejdsflow-problemer på tværs af forretningsområder. Nedenfor fem typiske eksempler fra virkelige Odoo-implementeringer.
1. CRM: Forudfyld salgsteam på nye leads
Hvis en salgsleder arbejder i et kanban-filter for sit team og klikker 'Ny', forventer hun at leaddet automatisk får det rette team. Ved at sende default_team_id i action-konteksten åbnes formen allerede udfyldt. Det minimerer fejl og sparer tid.
2. Salg: Forudbestem prislisten ud fra kundesegment
Når sælgeren opretter et tilbud fra en kundekategori, kan prislisten forudindstilles via kontekst, fx default_pricelist_id baseret på kategorien. Det guider til korrekt prissætning uden at blokere valgmuligheder.
3. Lager: Filtrering af lokationer i flytteformularer
I lagerstyring kan kilden i en transferformular begrænses til lokationer fra én specifik lagerplads ved at sende et domain i konteksten på Many2one-feltet. Det holder dropdowns relevante og reducerer tastefejl i multi-lageropsætninger.
4. Regnskab: Fakturalinjer i kundens sprog
Når du laver fakturaer til udenlandske kunder, kan lang-konteksten tvinge oversatte beskrivelser frem i kundens sprog. En faktura til en fransk kunde viser varer og beskrivelser på fransk, selv om databasen er på engelsk.
5. Specialmodeller: Vise arkiverede produkter i en særlig liste
Driftsteamet skal måske se udfasede produkter sammen med aktive. En custom list action sender active_test: False i sin kontekst, så kun den view viser alle produkter uden at ændre global søgeadfærd.
Sådan opretter og ændrer du kontekst på felter
Der er to måder at tilføje eller ændre kontekst på felter: no-code med Odoo Studio eller teknisk via Python og XML — begge er vigtige i en praktisk teknisk Odoo-guide.
Brug af Odoo Studio
Odoo Studio lader dig ændre visse feltindstillinger uden at kode. For relationelle felter kan du indstille en simpel kontekst med default-værdier, som anvendes ved oprettelse fra den pågældende relation.
Det er velegnet til enkle tilfælde: forudfylde firma, team, kategori eller ansvarlig. Studios værktøj er dog bevidst forenklet; dynamisk kontekst, der refererer andre felter, kræver teknisk XML/Python-arbejde.
Husk også, at Studio gemmer kontekst direkte på viewet. Hvis du senere laver tekniske tilpasninger, bør du tjekke for eksisterende Studio-kontekst for at undgå konflikter.
Definere kontekst på felter i Python
I et custom modul tilføjer du kontekst på feltdefinitionen. For en Many2one accepterer context-parameteren en statisk dict:
Denne statiske kontekst gælder hver gang feltet indlæser eller opretter relaterede poster. Den reagerer ikke på andre felters værdier — hvis du har brug for dynamik, placér logikken i viewet i stedet.
Definere kontekst i XML-views
I view-XML kan context være en streng, som Odoo evaluerer ved runtime. Du kan referere til felter, bruger-ID (uid), aktiv post-id (active_id) og lignende variabler.
Det gør view-kontekst langt mere fleksibelt end felt-kontekst. Det er standardmetoden i Odoo-frameworket for formularer, hvor ett felts adfærd afhænger af et andet — det skaber brugervenlige, native følende flows.
Sende kontekst via window actions
Kontekst kan også defineres på ir.actions.act_window-poster. Menus og knapper sender typisk kontekst via deres action, og denne kontekst flettes ind i sessionen, når viewet åbner.
Det er en ren måde at håndtere scenarier som CRM-eksemplet: konteksten hører til handlingen, ikke feltet, så du kan have forskellige standarder i forskellige navigationssammenhænge uden at røre modelkoden.
Gode fremgangsmåder
Arbejdet med kontekst bliver langt mere stabilt, hvis du følger nogle faste vaner — uanset om du bygger moduler eller laver hurtige Odoo-tilpasninger.
- Brug kontekst til vejledning, ikke tvang. Kontekst er godt til at foreslå værdier; hvis noget skal være absolut, anvend domains eller validering (onchange/constraints).
- Læg dynamisk kontekst i views, ikke i feltdefinitioner. Felt-niveau kontekst er statisk og kan ikke reagere på aktuelle postværdier.
- Brug altid
with_context()i stedet for at modificereenv.contextdirekte. Odoo forventer, at miljøet behandles immutabelt inden for et kald — med_context skaber en ny, sikker kopi. - Vær bevidst om, hvilke nøgler du sender. Kontekster akkumuleres gennem kaldkæden; unødvendige nøgler kan påvirke andre metoder uventet.
- Brug kontekst til at sende flags for betinget logik. Et mønster er fx
from_wizard: True, som du tjekker i compute/onchange for at ændre adfærd uden at oprette ekstra felter til workflow-tilstand. - Dokumentér dine custom kontekstnøgler i modulet. Kontekst er usynlig i UI, så kommentarer eller docstrings hjælper andre udviklere (og dig selv) senere.
Almindelige fejltrin
Fejl relateret til kontekst kan være svære at finde, fordi de sjældent efterlader tydelige spor i UI’en. Her er de hyppigste faldgruber.
At betragte default_* som tvingende værdier
Et default_* i kontekst bliver kun anvendt, når posten oprettes fra en formular med den kontekst. Hvis du opretter poster via ORM uden at sende kontekst, får du ikke standarden. Mange udviklere forventer fejlagtigt, at context-defaults opfører sig ligesom field-level default. Husk at sende kontekst eksplicit i kode, hvis den betyder noget.
At ændre kontekst-dictionaryen direkte
Kontekstordbogen deles gennem kaldkæden. Hvis du muterer self.env.context direkte kan du påvirke alt, der kører i samme transaktion. Den rigtige fremgangsmåde er altid at bruge self.with_context(new_key=value), som laver en ny kopi.
At sende for meget i kontekst
Hver nøgle rejser gennem hele call-stacken. Nogle Odoo-metoder reagerer på bestemte nøgler — utilsigtede nøgler kan aktivere uønskede adfærdsgrene. Hold kontekst slank og målrettet.
At glemme active_test når du søger arkiverede poster
Som standard filtrerer search() og search_read() arkiverede poster væk (hvor active = False). Har din kode brug for arkiverede poster, skal du sætte active_test: False i konteksten. At glemme dette er en hyppig fejl i produkt- og lagertilpasninger.
Kontekstkonflikter mellem Studio og teknisk kode
Hvis Odoo Studio har sat kontekst på et viewfelt, og du bagefter laver en teknisk view-udvidelse på samme felt, kan konteksterne konflikte afhængig af XML-merge-ordenen. Inspicer eksisterende Studio-kontekst før du tilføjer din egen via inheritance — især når du blander Studio-felter og modulbaserede ændringer.
Afrunding
Kontekst er en diskret, men kraftfuld mekanisme i Odoo. Forstå hvordan den løber gennem feltdefinitioner, view-atributter og ORM-miljøet, og du opnår langt større kontrol over, hvordan din datamodel opfører sig.
De vigtigste pointer er enkle: brug default_* til at guide brugere uden at tvinge dem, læg dynamik i view-konteksten snarere end i felter, brug altid with_context() i stedet for direkte mutation, og hold kontekst minimal for at undgå utilsigtet påvirkning af andre systemdele.
Uanset om du følger et Odoo-felt-tutorial, udvikler et custom modul eller fejlsøger et mærkeligt feltadfærd, vil forståelsen af kontekst være en del af løsningen.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo, så det passer til deres konkrete arbejdsgange. Hvis du er usikker på en kontekstopsætning eller vil diskutere din Odoo-løsning, kan vi hjælpe.
Kontakt vores team via kontakt-siden og fortæl os, hvad I bygger. Vi arbejder med virksomheder i alle størrelser for at få Odoo til at virke, som det skal.