Hvis du har brugt tid på at arbejde med Odoo ORM eller tilpasse visninger, har du næsten helt sikkert set ordet kontekst dukke op. Det vises i feltdefinitioner, i XML-visningsattributter og gennem Odoos Python-kode. Alligevel forbliver det for mange udviklere og konsulenter en af de ting, der bare fungerer, indtil det ikke gør.
At forstå kontekstfelter i Odoo er ikke bare en akademisk øvelse. Det påvirker direkte, hvordan din datamodel opfører sig, hvordan formularer forudfylder værdier, hvordan poster filtreres, og hvordan beregnede felter beslutter, hvad de skal returnere. Uanset om du laver en simpel odoo-tilpasning eller bygger et fuldt modul, sparer det meget fejlfindingstid at få konteksten korrekt.
Denne guide nedbryder, hvad kontekst er, hvordan det flyder gennem Odoo-rammen, og hvordan man bruger det med selvtillid i virkelige projekter.
Hvad er kontekst i Odoo
Kontekst i Odoo er et Python-ordbog, der rejser med hver anmodning, hvert metodekald og hver postoperation. Det er ikke en felttype i traditionel forstand. Du vil ikke finde fields.Context() i Odoo ORM. I stedet er kontekst en mekanisme, der ændrer, hvordan felter opfører sig.
Tænk på det som et sæt usynlige instruktioner, der sendes sammen med dine data. Disse instruktioner fortæller Odoo ting som: forudfyld dette felt med en standardværdi, vis også arkiverede poster, beregn dette felt ved hjælp af et andet sprog, eller anvend dette domæne, når du viser vælgeren for relaterede poster.
Hvor vises kontekst
Du vil støde på kontekst tre hovedsteder i Odoo datamodellen:
- På feltdefinitioner i Python: Parameteren
contextpå relationelle felter som Many2one, One2many og Many2many. - I XML visningsattributter: Attributten
contextpå<field>tags i formular-, liste- og kanbanvisninger. - I ORM-miljøet: Tilgængelig via
self.env.contexti Python-kode, og kan ændres medself.with_context(key=value).
I alle tre tilfælde gør konteksten det samme grundlæggende: den bærer ekstra information, der former, hvordan et felt eller en post opfører sig ved kørsel.
Hvordan kontekst fungerer i Odoo-datamodellen
Konteksten flyder gennem Odoo-anmodningslivscyklussen fra det øjeblik, en bruger åbner en formular, til det øjeblik, en post gemmes. Her er, hvordan de vigtigste mekanismer fungerer i praksis.
Standardværdier med default_*
En af de mest almindeligt anvendte kontekstmønstre er default_field_name. Når du sender en nøgle, der starter med default_, bruger Odoo den til at forudfylde et felt, når en ny post oprettes.
For eksempel, hvis en knap åbner en ny salgsordreformular og sender {"default_partner_id": 42} i konteksten, vil kunde-feltet allerede være indstillet til partneren med ID 42. Brugeren ser en forudfyldt formular uden behov for yderligere Python-logik.
Dette mønster bruges flittigt i Odoo-udvikling til at skabe smarte navigationsstrømme mellem poster.
Kontekstattributten på relationelle felter
Når du definerer et Many2one, One2many eller Many2many felt i Python, kan du sende et context parameter. Denne kontekst anvendes, når det relationelle felt indlæser eller opretter poster gennem sin popup eller dropdown.
Et praktisk eksempel: et Many2one, der peger på res.partner med context={"default_is_company": True} betyder, at hvis brugeren opretter en ny partner direkte fra det felt, vil Er en virksomhed afkrydsningsfeltet være forudafkrydset. Du skubber brugeren mod de rigtige data uden at tvinge det.
Kontekst i XML-visninger
I visnings-XML fungerer context attributten på et felt-tag på samme måde, men den kan være dynamisk. Du kan referere til andre feltværdier ved hjælp af Odoo's evalueringssyntaks:
Dette giver dig mulighed for at bygge intelligente formularer, hvor konteksten for et felt afhænger af værdien af et andet. Det er en kerne teknik i odoo tilpasning til at skabe smarte relationelle adfærd uden at skrive ekstra Python-kode.
Læsning og ændring af kontekst i Python
Inden for enhver modelmetode kan du læse den aktuelle kontekst ved hjælp af self.env.context. Dette giver dig det fulde ordbog som det var, da metoden blev kaldt.
For at køre kode med en ændret kontekst bruger du self.with_context(key=value). Dette returnerer et nyt recordset, der bærer den opdaterede kontekst uden at ændre den oprindelige. Det er et rent, ikke-destruktivt mønster, der passer godt til Odoo's funktionelle programmeringsstil.
Almindelige indbyggede kontekstnøgler
Odoo selv bruger flere reserverede kontekstnøgler, der udløser specifik adfærd på tværs af Odoo-rammen:
lang: Ændrer sproget, der bruges til oversatte feltværdier.active_test: Sættes tilFalsefor at inkludere arkiverede poster i søgeresultater.no_recompute: Forhindrer, at gemte beregnede felter bliver genberegnet.mail_notrack: Deaktiverer chatter tracking for en skriveoperation.allowed_company_ids: Kontrollerer synligheden af multi-company poster.bin_size: Returnerer filstørrelser i stedet for binært indhold for binære felter.
At kende disse indbyggede nøgler er en del af enhver solid odoo udviklerguide, fordi de lader dig kontrollere adfærd uden at skrive brugerdefineret kode.
Forretningsbrugssager
Kontextfelter er ikke kun et udviklerværktøj. De løser reelle arbejdsflowproblemer på tværs af forskellige forretningsområder. Her er fem eksempler fra almindelige Odoo-implementeringer.
1. CRM: Forudfyldning af Salesteamet på Nye Leads
En salgsleder har en kanbanvisning filtreret til sit team. Når hun klikker på "Ny", forventer hun, at leadet automatisk bliver tildelt hendes team. Ved at sende default_team_id i handlingens kontekst, bliver teamfeltet forudfyldt i det øjeblik formularen åbnes. Ingen manuel valg nødvendig, ingen forkerte teamtildelinger.
2. Salg: Forudindstilling af Prisliste Baseret på Kundesegmentet
Når en sælger opretter et tilbud fra en specifik kundekategorivisning, kan prislisten feltet forudindstilles ved hjælp af kontekst. Konteksten bærer default_pricelist_id baseret på kategorien, hvilket vejleder sælgeren til den rigtige pris uden at begrænse deres valg.
3. Lager: Filtrering af Lokationer i Overførselsformularer
I lageroperationer kan en overførselsformularens kilde-lokationsfelt bruge kontekst til at begrænse dropdown-menuen til kun lokationer, der tilhører et specifikt lager. Dette gøres ved at sende et domæne via kontekst på Many2one-feltet, hvilket holder grænsefladen ren og reducerer fejl i multi-lager opsætninger.
4. Regnskab: Multi-sprog Fakturalinjer
Når der genereres fakturaer til internationale kunder, tvinger lang kontekstnøglen oversatte beskrivelser til at vises på kundens sprog. En faktura sendt til en fransk kunde vil vise produktnavne og beskrivelser på fransk, selvom den interne database gemmer alt på engelsk.
5. Tilpassede modeller: Vise arkiverede produkter i en særlig visning
Et driftsteam har brug for at gennemgå udgåede produkter sammen med aktive. En tilpasset listevisning sender active_test: False i sin handlingskontekst. Uden at ændre nogen Python-kode vises alle produkter, inklusive arkiverede, i den specifikke visning, mens resten af grænsefladen forbliver uændret.
Oprettelse og tilpasning af kontekst på felter
Der er to veje til at tilføje eller ændre kontekst på felter i Odoo: ved at bruge Odoo Studio til no-code justeringer eller ved at skrive Python og XML for fuld teknisk kontrol. Dette er en nøglekomponent i enhver odoo teknisk tutorial om felters adfærd.
Brug af Odoo Studio
Odoo Studio giver dig mulighed for at ændre visse feltegenskaber uden at skrive kode. For relationelle felter eksponerer Studio en konfigurationsmulighed for kontekst, hvor du kan indstille standardværdier, der vil blive anvendt, når en ny post oprettes fra det felt.
Dette er nyttigt til enkle tilfælde: forudfyldning af et firma, et team, en kategori eller en ansvarlig bruger. Begrænsningen er, at Studios kontekstunderstøttelse er bevidst forenklet. For dynamisk kontekst, der refererer til andre felteværdier, skal du tage den tekniske rute.
Når du bruger odoo studio felter, skal du huske, at den kontekst, du indstiller, gemmes direkte på visningen. Hvis du senere opretter en teknisk tilpasning på den samme visning, skal du tage højde for eksisterende Studio-defineret kontekst for at undgå konflikter.
Definere kontekst på felter i Python
I et tilpasset modul tilføjes kontekst direkte til feltddefinitionen. For et Many2one-felt accepterer context parameteren et statisk ordbog:
Denne statiske kontekst anvendes hver gang feltet indlæses eller opretter relaterede poster. Den ændres ikke baseret på andre felteværdier. For en kontekst, der reagerer på den aktuelle post tilstand, flytter du logikken til visningsniveauet i stedet.
Definere kontekst i XML-visninger
I visnings-XML accepterer kontekstattributten en streng, som Odoo evaluerer ved kørsel. Du kan referere til feltværdier, den aktuelle bruger-ID (uid), den aktive post-ID (active_id) og andre variabler:
Dette gør kontekst på visningsniveau meget mere fleksibel end kontekst på felt-niveau. Det er den standardmetode i odoo-rammen til at bygge formularer, hvor et fields adfærd afhænger af et andet. Dette er også hvordan du opretter felter odoo adfærd, der føles indfødt og intuitiv for slutbrugere.
Videregive kontekst via vindueshandlinger
Kontekst kan også sættes på ir.actions.act_window poster. Dette er, hvordan menuer og knapper videregiver kontekst til de visninger, de åbner. Et actions context felt indeholder den ordbog, der bliver flettet ind i sessionens kontekst, når visningen indlæses.
Dette er den reneste måde at håndtere brugssager som CRM salgsteameksemplet ovenfor. Konteksten lever på handlingen, ikke på feltdefinitionen, hvilket betyder, at du kan have forskellige standarder i forskellige navigationskontekster uden at røre ved modelkoden.
Bedste praksis
At arbejde med kontekst i Odoo bliver meget lettere, når du følger nogle få konsekvente vaner. Disse gælder, uanset om du bygger et modul eller laver en hurtig odoo-tilpasning.
- Brug kontekst til forslag, ikke håndhævelse. Kontekst-drevne standarder guider brugerne uden at blokere dem. Hvis du har brug for en hård begrænsning, skal du i stedet bruge et domæne eller en onchange-metode.
- Put dynamisk kontekst i visninger, ikke i feltdefinitioner. Felt-niveau kontekst er statisk. Hvis konteksten skal afspejle den aktuelle post tilstand, er visnings-XML det rigtige sted for det.
- Brug with_context() i stedet for at ændre env.context direkte. Odoos miljø er designet til at være uforanderligt inden for et kald. Opret altid et nyt miljø med
with_context()i stedet for at forsøge at ændre det eksisterende. - Vær bevidst om, hvad du videregiver i konteksten. Kontekstnøgler akkumuleres, mens de rejser gennem kaldestakken. At videregive unødvendige nøgler kan føre til uventet adfærd i metoder, der tjekker for disse nøgler.
- Brug kontekst til at videregive flag for betinget logik. Et almindeligt mønster er at videregive et boolean flag som
from_wizard: Truei konteksten, og derefter tjekke for det i en compute- eller onchange-metode for at anvende forskellig adfærd. Dette undgår at forurene modelfelter med arbejdsflowstatus. - Dokumentér brugerdefinerede kontekstnøgler i dit modul. Kontekstnøgler er usynlige, medmindre du ved, at du skal kigge efter dem. Tilføj en kommentar eller docstring, der forklarer eventuelle brugerdefinerede kontekstnøgler, som dit modul læser eller sætter. Dette betaler sig, når du eller en kollega vender tilbage til koden senere.
Almindelige faldgruber
Kontekstrelaterede fejl kan være svære at diagnosticere, fordi konteksten er usynlig i brugergrænsefladen. Disse er de fejl, der oftest opstår i virkelige projekter.
At behandle default_* som obligatoriske værdier
En standardværdi, der er indstillet via kontekst, anvendes kun, når en post oprettes gennem en formular. Hvis du opretter poster programmatisk via ORM uden at videregive den relevante kontekst, vil standarden ikke blive anvendt. Udviklere forventer nogle gange, at kontekststandarder opfører sig som Python-niveau default-parametre på felter. Det gør de ikke. Sørg altid for at videregive konteksten eksplicit, når du opretter poster i koden, hvis disse standarder er vigtige.
At ændre kontekstordbogen direkte
Kontekstordbogen deles på tværs af kaldestakken. Hvis du ændrer self.env.context direkte, kan du påvirke anden kode, der kører i den samme transaktion på uventede måder. Den korrekte metode er altid self.with_context(new_key=value), som opretter et nyt miljø med en kopi af konteksten plus dine ændringer.
At videregive for meget i konteksten
Hver nøgle, du tilføjer til konteksten, rejser gennem hele kaldkæden. Nogle Odoo-metoder tjekker for specifikke kontekstnøgler og ændrer deres adfærd i overensstemmelse hermed. At videregive uventede nøgler kan utilsigtet udløse disse grene. Hold konteksten slank og specifik for, hvad den umiddelbare operation har brug for.
At glemme active_test, når man søger i arkiverede poster
Som standard filtrerer Odoo's search() og search_read() metoder arkiverede poster (hvor active = False) fra. Hvis din kode skal arbejde med arkiverede poster, skal du eksplicit videregive active_test: False i konteksten. At glemme dette er en meget almindelig fejl i tilpasninger af lager og produktstyring.
Kontekstkonflikter mellem Studio og brugerdefineret kode
Hvis Odoo Studio har indstillet kontekst på et felt i en visning, og du senere tilføjer en teknisk visningsudvidelse, der retter sig mod det samme felt, kan begge kontekster konflikte, eller den ene kan overskrive den anden afhængigt af XML-sammenfletningsrækkefølgen. Inspicer altid eksisterende kontekst på et felt, før du tilføjer din egen via en visningsarv. Dette er et særligt almindeligt problem, når man blander odoo studio felter med modulbaserede tilpasninger.
Konklusion
Kontekst er en af de mekanismer i Odoo, der stille og roligt udfører meget arbejde. Når du forstår, hvordan det flyder gennem feltdefinitioner, visningsattributter og ORM-miljøet, får du et meget finere niveau af kontrol over, hvordan din datamodel opfører sig.
De vigtigste pointer er ligetil. Brug default_* nøgler til at guide brugerne mod korrekt data uden at tvinge dem. Sæt dynamisk kontekst i visninger i stedet for feltdefinitioner. Brug altid with_context() i stedet for at ændre konteksten på stedet. Og hold din kontekst slank, så den ikke uventet forstyrrer andre dele af systemet.
Uanset om du arbejder igennem en odoo felt tutorial, bygger et tilpasset modul, eller fejlfinder et felt, der opfører sig mærkeligt, vil forståelse af kontekst altid være en del af svaret.
Hos Dasolo hjælper vi virksomheder med at implementere, tilpasse og optimere Odoo, så det passer til deres reelle forretningsarbejdsgange. Hvis du arbejder på en tilpasning, hvor kontekst er involveret, og du ikke er sikker på, at du har det rigtigt, eller hvis du bare vil tale om din Odoo-implementering, er vi glade for at hjælpe.
Kontakt vores team via kontakt siden og lad os vide, hvad du bygger. Vi arbejder med virksomheder i alle størrelser for at få Odoo til at fungere, som det skal.