Hvis du har jobbet med Odoo‑ORM eller skreddersydd visninger, har du helt sikkert møtt begrepet context. Det dukker opp i feltdefinisjoner, i XML‑attributter for visninger og i Python‑logikken. For mange virker det som en usynlig mekanisme som fungerer — inntil den plutselig skaper overraskelser.
Å forstå context i Odoo er ikke bare teori. Det påvirker hvordan modeller oppfører seg, hvilke felt som blir forhåndsutfylt, hvilke poster som vises i søk, og hvordan beregnede felt avgjør resultatet. Enten du gjør en enkel Odoo‑tilpasning eller utvikler et komplett modulsett, sparer riktig bruk av context mye feilsøkingstid.
Denne guiden forklarer hva context er, hvordan den beveger seg gjennom Odoo‑rammeverket, og hvordan du brukes den trygt i virkelige prosjekter.
Hva betyr «context» i Odoo
I Odoo er context i praksis en Python‑ordbok som følger med hver forespørsel, metodekall og datamanipulasjon. Det er ikke en egen felttype i ORM‑metodene — du finner ikke et fields.Context(). Context fungerer som et ekstra lag med metadata som endrer felt- og operasjonsoppførsel.
Tenk på context som skjulte instruksjoner som følger med et kall: forhåndsutfyll dette feltet, vis også arkiverte poster, bruk en annen språkinnstilling ved beregning, eller begrens listen i en relasjonsvelger. De endrer hvordan Odoo oppfører seg uten å måtte endre modellkoden.
Hvor context dukker opp
Du møter context hovedsakelig på tre steder i Odoo‑datamodellen:
- På felt i Python: Relasjonsfelt (Many2one, One2many, Many2many) kan få en context‑parameter som påvirker hvordan nye relaterte poster opprettes eller vises.
- I XML‑visninger: Felt‑taggen i form, liste eller kanban kan ha et
context‑attributt som evalueres når visningen åpnes. - I ORM‑miljøet: På Python‑siden leser du
self.env.contextog lager endrede miljøer medself.with_context(key=value).
I alle disse tilfellene gjør context samme jobb: den frakter ekstra informasjon som påvirker runtime‑oppførselen til felt eller operasjoner.
Hvordan context fungerer i Odoo‑modellene
Context følger brukerens handlinger fra skjermåpning til lagring. Slik fungerer de viktigste mekanismene i praksis.
Forhåndsverdier med default_*
Et vanlig mønster er å sende nøkler som begynner med default_. Disse brukes for å forhåndsutfylle felt når en ny post opprettes via en visning eller en action.
For eksempel: en knapp som åpner et nytt salgsordre‑skjema kan sende {"default_partner_id": 42}. Når skjemaet åpnes, er kunde‑feltet allerede utfylt med partner ID 42, uten ekstra Python‑logikk.
Dette er et effektivt grep i Odoo‑utvikling for å lage flyt i brukergrensesnittet der brukeren ledes til riktige valg.
Context‑attributtet på relasjonsfelt
Når du definerer relasjonsfelt i Python kan du gi en context‑parameter. Denne brukes hver gang feltet åpner en opprettelsesdialog eller viser relaterte poster.
Et praktisk scenario: en Many2one mot res.partner med context={"default_is_company": True} gjør at en ny partner opprettet fra dette feltet får «Er selskap» forhåndsvalgt. Du veileder brukeren uten å tvinge fram et svar.
Context i XML‑visninger
I XML fungerer context på samme måte, men kan være dynamisk. Du kan referere til andre felter og evaluere uttrykk ved runtime:
Dermed kan ett felt påvirke hvordan et annet oppfører seg uten at du skriver ekstra Python. Dette er en kjerne‑teknikk i Odoo‑tilpasninger for å bygge smarte skjemaer.
Lese og endre context i Python
I modellmetoder leser du konteksten med self.env.context, som returnerer hele ordboken slik den var ved kallet.
Ønsker du å kjøre kode med endret context, bruker du self.with_context(key=value). Det returnerer et nytt recordset med oppdatert context uten å mutere det originale miljøet — en trygg, funksjonell måte å arbeide på.
Vanlige innebygde context‑nøkler
Odoo har flere reserverte context‑nøkler som styrer spesifikke oppførsler i rammeverket:
lang: Angir hvilket språk oversettelser skal bruke.active_test: Sett tilFalsefor å inkludere arkiverte poster i søk.no_recompute: Hindrer rekalkulasjon av lagrede beregnede felt.mail_notrack: Slår av chatter‑sporing ved skriveoperasjoner.allowed_company_ids: Styrer synlighet i flerselskapsscenarioer.bin_size: Returnerer størrelse i stedet for binærinnhold for Binary‑felt.
Å kjenne disse nøklene er nyttig for enhver Odoo‑utvikler, siden de lar deg styre oppførsel uten å skrive ekstra logikk.
Praktiske forretningsscenarier
Context er ikke bare et utviklerverktøy — den løser reelle arbeidsflytbehov i ulike forretningsområder. Her er fem praktiske eksempler fra vanlige Odoo‑implementasjoner.
1. CRM: Forhåndsvalg av salgsteam ved nye leads
En salgsleder ser en kanban filtrert til sitt team. Ved å bruke default_team_id i action‑context blir nye leads automatisk tildelt riktig team når skjemaet åpnes — færre feil og raskere registrering.
2. Salg: Standardprislist basert på kundesegment
Når et tilbud opprettes fra en kundegruppe‑visning, kan default_pricelist_id settes via context basert på gruppen. Selgeren får riktig prisforslag uten at valgfriheten fjernes.
3. Lager: Begrense lokasjoner i overføringsskjemaer
I lagerflyt kan en transfer‑skjemaets kildelokasjon få en kontekst‑styrt domain slik at dropdownet kun viser lokasjoner fra aktuell lagerenhet — enklere grensesnitt og færre plukke‑feil i multi‑lager.
4. Regnskap: Fakturalinjer på kundens språk
Ved internasjonal fakturering kan lang i context tvinge produktbeskrivelser til kundens språk. En faktura til en fransk kunde vil vise linjetekster på fransk selv om databasen primært er på engelsk.
5. Egne modeller: Vise arkiverte produkter i spesialvisninger
Et driftsteam skal gå gjennom avsluttede produkter. En tilpasset liste‑action kan sende active_test: False i context, slik at arkiverte varer inkluderes i akkurat den visningen uten å endre global oppførsel.
Legge til og tilpasse context på felt
Du kan legge inn eller endre context på felt enten ved å bruke Odoo Studio for enkle justeringer eller ved å skrive Python og XML for mer avansert kontroll. Begge tilnærmingene er viktige i en teknisk Odoo‑guide.
Bruke Odoo Studio
Studio lar deg sette enkle context‑standarder på relasjonsfelt uten å kode. Dette er fint for forhåndsutfylling av selskap, team, kategori eller ansvarlig bruker når en ny relasjon opprettes fra feltet.
Studio er praktisk for faste, enkle tilfeller. Når context må være dynamisk og avhengig av andre felt, må du gå veien via teknisk XML‑løsning.
Husk at Studio lagrer context direkte i visningen. Hvis du senere utvikler teknisk tilpasning mot samme visning, må du ta hensyn til eksisterende Studio‑context for å unngå konflikter.
Definere context på felt i Python
I en modul legger du context på feltet i definisjonen. For Many2one godtas en statisk dictionary som parameter i feltkonstruktøren:
Slik statisk context brukes hver gang feltet laster eller oppretter relaterte poster og endres ikke av andre felt. Når context må reagere på postens tilstand, bør logikken heller ligge i visningen.
Definere context i XML‑visninger
I view‑XML kan context være et uttrykk evaluert ved runtime. Du kan referere til feltverdier, gjeldende bruker‑ID (uid), aktiv post‑ID (active_id) og andre variable:
Dette gjør view‑context mer fleksibelt enn felt‑context. Det er standardmåten i Odoo‑rammeverket for å lage felter som oppfører seg ulikt avhengig av skjemaets tilstand — hvordan du skaper naturlige og intuitive feltopplevelser for sluttbrukere.
Sette context via Window Actions
Context kan også defineres på ir.actions.act_window. Menyen eller knappen kan legge context på action‑definisjonen, og denne merges inn i sessionens context når visningen åpnes.
Dette er ofte den beste måten å løse scenarier som CRM‑eksempelet over: context lever på action‑nivå slik at du kan ha forskjellige forhåndsvalg avhengig av hvor brukeren kommer fra, uten å endre modellkoden.
Anbefalte fremgangsmåter
Arbeidet med context blir enklere om du følger noen faste vaner — enten du utvikler moduler eller gjør raske Odoo‑tilpasninger.
- Bruk context for forslag, ikke for å tvinge valg. Context‑defaults skal veilede brukere. Hvis du trenger bindinger, bruk domain, constraints eller onchange‑logikk i stedet.
- Legg dynamisk context i visningene, ikke som felt‑parameter. Felt‑context er statisk; når verdier må avhengig av posten, hører logikken i XML‑visningen.
- Bruk
with_context()i stedet for å endreenv.contextdirekte. Miljøet er ment å være uforanderlig i et kall —with_context()lager et nytt miljø med kopiert context. - Vær bevisst på hva du putter i context. Context‑nøkler akkumuleres gjennom kallstakken — unødvendige nøkler kan skape uventet oppførsel i kode som sjekker for dem.
- Bruk context som flagg for betinget logikk. Et vanlig mønster er
from_wizard: Truei context, som modellmetoder kan sjekke for å endre oppførsel uten å introdusere flere felt i modellen. - Dokumenter egendefinerte context‑nøkler i modulen. Fordi context er «usynlig» i UI, hjelper kommentarer eller docstrings andre utviklere (eller deg senere) å forstå hvorfor en gitt nøkkel eksisterer.
Vanlige fallgruver
Feil knyttet til context kan være vanskelige å finne siden de ikke vises direkte i UI. Her er de vanligste tabbene i praksis.
Å tro at default_* er obligatoriske verdier
Et context‑default gjelder bare når posten blir opprettet via en visning eller action som sender den. Om du oppretter poster programmatisk uten å sende context, vil ikke default_* bli brukt. Det er en hyppig misforståelse å anta at de oppfører seg som feltets Python‑default.
Mutere context‑ordboken direkte
Context‑ordboken deles ned kallstakken. Å endre self.env.context direkte kan påvirke annen kode i samme transaksjon. Riktig mønster er å bruke self.with_context(new_key=value) for å få et nytt miljø.
Å sende for mye i context
Hver nøkkel du legger til følger med alle etterfølgende kall. Noen Odoo‑metoder sjekker for spesifikke nøkler og kan skifte atferd. Hold context smal og presis for det konkrete behovet.
Å glemme active_test når du søker i arkiverte poster
Søk som search() filtrerer som standard bort poster med active=False. Om koden din skal inkludere arkiverte elementer, må du eksplisitt sende active_test: False i context — ellers får du ikke med dem.
Konflikter mellom Studio og teknisk kode
Hvis Studio har lagt context på et felt og du senere endrer samme visning via teknisk arv, kan contexten komme i konflikt eller overstyre hverandre avhengig av XML‑merge. Kontroller eksisterende context før du legger på egne endringer.
Oppsummering
Context er en kraftfull, men ofte skjult mekanisme i Odoo. Når du forstår hvordan den beveger seg mellom feltdefinisjoner, visninger og ORM‑miljøet, får du vesentlig bedre kontroll over modelloppførsel.
Hovedregelen er enkel: bruk default_* for å veilede brukere, plasser dynamikk i visningene, bruk with_context() for endringer, og hold context ryddig slik at den ikke bryter andre deler av systemet.
Enten du følger et Odoo‑feltkurs, utvikler en modul eller feilsøker et merkelig feltproblem, vil riktig forståelse av context alltid være sentral.
Hos Dasolo hjelper vi bedrifter med å implementere, tilpasse og optimalisere Odoo slik at det støtter faktiske forretningsprosesser. Trenger du hjelp med en tilpasning der context spiller inn — eller vil du diskutere hvordan Odoo bør settes opp — kan vi bistå.
Ta kontakt med teamet vårt via kontaktsiden og fortell oss hva dere bygger. Vi jobber med virksomheter i alle størrelser for å få Odoo til å fungere slik det skal.