Hvis du har brukt tid på å jobbe med Odoo ORM eller tilpasse visninger, har du nesten helt sikkert sett ordet kontekst dukke opp. Det vises i feltdedefinisjoner, i XML-visningsattributter, og gjennom Odoos Python-kode. Likevel forblir det for mange utviklere og konsulenter en av de tingene som bare fungerer til det ikke gjør det.
Å forstå kontekstfelt i Odoo er ikke bare en akademisk øvelse. Det påvirker direkte hvordan datamodellen din oppfører seg, hvordan skjemaer forhåndsutfyller verdier, hvordan poster filtreres, og hvordan beregnede felt bestemmer hva de skal returnere. Enten du gjør en enkel odoo-tilpasning eller bygger et fullverdig modul, sparer det mye feilsøkingstid å få konteksten riktig.
Denne guiden bryter ned hva kontekst er, hvordan det flyter gjennom Odoo-rammeverket, og hvordan du kan bruke det med selvtillit i virkelige prosjekter.
Hva er kontekst i Odoo
Kontekst i Odoo er en Python-ordbok som reiser sammen med hver forespørsel, hver metodekall, og hver postoperasjon. Det er ikke en felttype i tradisjonell forstand. Du vil ikke finne fields.Context() i Odoo ORM. I stedet er kontekst en mekanisme som endrer hvordan felt oppfører seg.
Tenk på det som et sett med usynlige instruksjoner som sendes sammen med dataene dine. Disse instruksjonene forteller Odoo ting som: forhåndsutfyll dette feltet med en standardverdi, vis arkiverte poster også, beregn dette feltet ved å bruke et annet språk, eller bruk dette domenet når du viser velgeren for relaterte poster.
Hvor vises kontekst
Du vil støte på kontekst på tre hovedsteder i Odoo datamodellen:
- På feltdefinisjoner i Python:
context-parameteren på relasjonsfelt som Many2one, One2many og Many2many. - I XML-visningsattributter:
context-attributtet på<field>-tagger i skjema-, liste- og kanban-visninger. - I ORM-miljøet: Tilgjengelig via
self.env.contexti Python-kode, og kan endres medself.with_context(key=value).
I alle tre tilfeller gjør konteksten det samme grunnleggende: den bærer ekstra informasjon som former hvordan et felt eller en post oppfører seg ved kjøring.
Hvordan kontekst fungerer i Odoo-datamodellen
Konteksten flyter gjennom Odoo-forespørselens livssyklus fra det øyeblikket en bruker åpner et skjema til det øyeblikket en post lagres. Her er hvordan de viktigste mekanismene fungerer i praksis.
Standardverdier med default_*
En av de mest brukte kontekstmønstrene er default_field_name. Når du sender en nøkkel som begynner med default_, bruker Odoo den til å forhåndsutfylle et felt når en ny post opprettes.
For eksempel, hvis en knapp åpner et nytt salgsordre-skjema og sender {"default_partner_id": 42} i konteksten, vil kunde-feltet allerede være satt til partneren med ID 42. Brukeren ser et forhåndsutfylt skjema uten at det kreves ytterligere Python-logikk.
Dette mønsteret brukes mye i Odoo-utvikling for å lage smarte navigasjonsflyter mellom poster.
Kontekstattributtet på relasjonsfelt
Når du definerer et Many2one, One2many eller Many2many-felt i Python, kan du sende en context-parameter. Denne konteksten brukes når det relasjonelle feltet laster eller oppretter poster gjennom sitt popup- eller nedtrekksfelt.
Et praktisk eksempel: et Many2one som peker til res.partner med context={"default_is_company": True} betyr at hvis brukeren oppretter en ny partner direkte fra det feltet, vil Er en bedrift-boksen være forhåndsmerket. Du veileder brukeren mot de riktige dataene uten å tvinge det.
Kontekst i XML-visninger
I visnings-XML fungerer context-attributtet på et felt-tag på samme måte, men det kan være dynamisk. Du kan referere til andre feltverdier ved å bruke Odoo sin evalueringssyntaks:
Dette lar deg bygge intelligente skjemaer der konteksten til ett felt avhenger av verdien til et annet. Det er en kjerne teknikk i odoo-tilpasning for å lage smarte relasjonelle atferder uten å skrive ekstra Python-kode.
Lese og endre kontekst i Python
Inne i enhver modellmetode kan du lese den nåværende konteksten ved å bruke self.env.context. Dette gir deg hele ordboken slik den var da metoden ble kalt.
For å kjøre kode med en modifisert kontekst, bruker du self.with_context(key=value). Dette returnerer et nytt recordset som bærer den oppdaterte konteksten uten å endre den originale. Det er et rent, ikke-destruktivt mønster som passer godt med Odoo sin funksjonelle programmeringsstil.
Vanlige innebygde kontekstnøkler
Odoo selv bruker flere reserverte kontekstnøkler som utløser spesifikk atferd på tvers av Odoo-rammeverket:
lang: Endrer språket som brukes for oversatte feltverdier.active_test: Settes tilFalsefor å inkludere arkiverte poster i søkresultater.no_recompute: Forhindrer at lagrede beregnede felt blir recalculert.mail_notrack: Deaktiverer chatter-sporing for en skriveoperasjon.allowed_company_ids: Kontrollerer synlighet for multi-selskapsposter.bin_size: Returnerer filstørrelser i stedet for binært innhold for binære felt.
Å kjenne disse innebygde nøklene er en del av enhver solid odoo utviklerguide fordi de lar deg kontrollere atferd uten å skrive tilpasset kode.
Forretningsbrukstilfeller
Kontekstsfelt er ikke bare et utviklerverktøy. De løser reelle arbeidsflytproblemer på tvers av forskjellige forretningsområder. Her er fem eksempler fra vanlige Odoo-implementeringer.
1. CRM: Forhåndsutfylling av salgsteamet på nye leads
En salgsleder har en kanban-visning filtrert til sitt team. Når hun klikker "Ny", forventer hun at leaden automatisk blir tildelt hennes team. Ved å sende default_team_id i konteksten til handlingen, blir teamfeltet forhåndsutfylt i det øyeblikket skjemaet åpnes. Ingen manuell valg nødvendig, ingen feil teamtildelinger.
2. Salg: Forhåndsinnstilling av prisliste basert på kundesegment
Når en selger oppretter et tilbud fra en spesifikk kundekategori-visning, kan prislistefeltet forhåndsinnstilles ved hjelp av kontekst. Konteksten bærer default_pricelist_id basert på kategorien, og veileder selgeren til riktig prising uten å begrense valgene deres.
3. Lager: Filtrering av lokasjoner i overføringsskjemaer
I lageroperasjoner kan kildeplasseringen i et overføringsskjema bruke kontekst for å begrense nedtrekkslisten til kun lokasjoner som tilhører et spesifikt lager. Dette gjøres ved å sende et domene via kontekst på Many2one-feltet, noe som holder grensesnittet rent og reduserer feil i multi-lageroppsett.
4. Regnskap: Flerspråklige Fakturalinjer
Når du genererer fakturaer for internasjonale kunder, tvinger lang konteksten oversatte beskrivelser til å vises på kundens språk. En faktura sendt til en fransk kunde vil vise produktnavn og beskrivelser på fransk, selv om den interne databasen lagrer alt på engelsk.
5. Tilpassede Modeller: Vise Arkiverte Produkter i en Spesiell Visning
Et driftsteam trenger å gjennomgå utgåtte produkter sammen med aktive. En tilpasset listevisning sender active_test: False i sin handlingskontekst. Uten å endre noe Python-kode, vises alle produkter, inkludert arkiverte, i den spesifikke visningen, mens resten av grensesnittet forblir uendret.
Opprette og tilpasse kontekst på felt
Det er to måter å legge til eller endre kontekst på felt i Odoo: ved å bruke Odoo Studio for kodefrie justeringer, eller ved å skrive Python og XML for full teknisk kontroll. Dette er en nøkkelkomponent i enhver odoo teknisk veiledning om feltatferd.
Bruke Odoo Studio
Odoo Studio lar deg endre visse felt-egenskaper uten å skrive kode. For relasjonsfelt eksponerer Studio et konfigurasjonsalternativ for kontekst der du kan sette standardverdier som vil bli brukt når en ny post opprettes fra det feltet.
Dette er nyttig for enkle tilfeller: forhåndsutfylling av et selskap, et team, en kategori eller en ansvarlig bruker. Begrensningen er at Studios kontekststøtte er bevisst forenklet. For dynamisk kontekst som refererer til andre feltverdier, må du gå den tekniske veien.
Når du bruker odoo studio-felt, husk at konteksten du setter lagres direkte på visningen. Hvis du senere oppretter en teknisk tilpasning på den samme visningen, må du ta hensyn til eksisterende Studio-definert kontekst for å unngå konflikter.
Definere Kontekst på Felt i Python
I et tilpasset modul legges konteksten direkte til feltdefinisjonen. For et Many2one-felt aksepterer context-parameteren et statisk ordbok:
Denne statiske konteksten brukes hver gang feltet laster eller oppretter relaterte poster. Den endres ikke basert på andre feltverdier. For en kontekst som reagerer på den nåværende postens tilstand, flytter du logikken til visningsnivået i stedet.
Definere kontekst i XML-visninger
I visnings-XML aksepterer kontekst-attributtet en streng som Odoo evaluerer ved kjøretid. Du kan referere til feltverdier, den nåværende bruker-ID-en (uid), den aktive post-ID-en (active_id), og andre variabler:
Dette gjør kontekst på visningsnivå mye mer fleksibel enn kontekst på felt-nivå. Det er den standard tilnærmingen i odoo-rammeverket for å bygge skjemaer der oppførselen til ett felt avhenger av et annet. Dette er også hvordan du lager felt odoo oppførsel som føles naturlig og intuitiv for sluttbrukere.
Overføre kontekst via vindusaksjoner
Kontekst kan også settes på ir.actions.act_window-poster. Dette er hvordan menyer og knapper overfører kontekst til visningene de åpner. Et aksjons context-felt inneholder ordboken som blir slått sammen med sesjonskonteksten når visningen lastes.
Dette er den reneste måten å håndtere brukstilfeller som CRM-salgsteameksempelet ovenfor. Konteksten lever på aksjonen, ikke på feltdefinisjonen, noe som betyr at du kan ha forskjellige standardverdier i forskjellige navigasjonskontekster uten å berøre modellkoden.
Beste praksis
Å jobbe med kontekst i Odoo blir mye smidigere når du følger noen konsistente vaner. Disse gjelder enten du bygger et modul eller gjør en rask odoo-tilpasning.
- Bruk kontekst for forslag, ikke håndheving. Kontekst-drevne standarder veileder brukerne uten å blokkere dem. Hvis du trenger en hard begrensning, bruk et domene eller en onchange-metode i stedet.
- Sett dynamisk kontekst i visninger, ikke i feltdefinisjoner. Kontekst på felt-nivå er statisk. Hvis konteksten må gjenspeile den nåværende postens tilstand, er visnings-XML det rette stedet for det.
- Bruk with_context() i stedet for å endre env.context direkte. Odoos miljø er designet for å være uforanderlig innen et kall. Opprett alltid et nytt miljø med
with_context()i stedet for å prøve å mutere det eksisterende. - Vær bevisst på hva du sender i konteksten. Kontekstnøkler akkumuleres mens de reiser gjennom kallstakken. Å sende unødvendige nøkler kan føre til uventet oppførsel i metoder som sjekker for disse nøklene.
- Bruk kontekst for å sende flagg for betinget logikk. Et vanlig mønster er å sende et boolsk flagg som
from_wizard: Truei konteksten, og deretter sjekke for det i en beregnings- eller onchange-metode for å bruke forskjellig oppførsel. Dette unngår å forurense modellfelt med arbeidsflyttilstand. - Dokumenter tilpassede kontekstnøkler i modulen din. Kontekstnøkler er usynlige med mindre du vet at du skal se etter dem. Legg til en kommentar eller docstring som forklarer eventuelle tilpassede kontekstnøkler modulen din leser eller setter. Dette gir uttelling når du eller en kollega kommer tilbake til koden senere.
Vanlige fallgruver
Kontekstrelaterte feil kan være vanskelige å diagnostisere fordi konteksten er usynlig i brukergrensesnittet. Dette er de feilene som oftest oppstår i virkelige prosjekter.
Å behandle default_* som obligatoriske verdier
En standardverdi satt via kontekst brukes kun når en post opprettes gjennom et skjema. Hvis du oppretter poster programmatisk via ORM uten å sende den relevante konteksten, vil standarden ikke bli brukt. Utviklere forventer noen ganger at kontekststandarder oppfører seg som Python-nivå default-parametere på felt. Det gjør de ikke. Pass alltid konteksten eksplisitt når du oppretter poster i kode hvis disse standardene er viktige.
Å mutere kontekstordboken direkte
Kontekstordboken deles over kallstakken. Hvis du endrer self.env.context direkte, kan du påvirke annen kode som kjører i samme transaksjon på uventede måter. Den riktige metoden er alltid self.with_context(new_key=value), som oppretter et nytt miljø med en kopi av konteksten pluss endringene dine.
Å sende for mye i konteksten
Hver nøkkel du legger til i konteksten reiser gjennom hele kallkjeden. Noen Odoo-metoder sjekker etter spesifikke kontekstnøkler og endrer atferden sin deretter. Å sende uventede nøkler kan utilsiktet utløse disse grenene. Hold konteksten slank og spesifikk for det umiddelbare operasjonen trenger.
Å glemme active_test når man søker i arkiverte poster
Som standard filtrerer Odoos search() og search_read() metoder ut arkiverte poster (hvor active = False). Hvis koden din må jobbe med arkiverte poster, må du eksplisitt sende active_test: False i konteksten. Å glemme dette er en veldig vanlig feil i tilpasninger av lager og produktadministrasjon.
Kontekstkonflikter mellom Studio og tilpasset kode
Hvis Odoo Studio har satt kontekst på et felt i en visning, og du senere legger til en teknisk visningsutvidelse som retter seg mot det samme feltet, kan begge kontekstene komme i konflikt eller en kan overstyre den andre avhengig av XML-sammenslåingsrekkefølgen. Inspiser alltid eksisterende kontekst på et felt før du legger til din egen via en visningsarv. Dette er et spesielt vanlig problem når man blander odoo studio-felt med modulbaserte tilpasninger.
Konklusjon
Kontekst er en av de mekanismene i Odoo som stille gjør mye arbeid. Når du forstår hvordan det flyter gjennom feltdefinisjoner, visningsegenskaper og ORM-miljøet, får du en mye finere kontroll over hvordan datamodellen din oppfører seg.
De viktigste punktene er enkle. Bruk default_* nøkler for å veilede brukerne mot korrekt data uten å tvinge dem. Sett dynamisk kontekst i visninger i stedet for feltdefinisjoner. Bruk alltid with_context() i stedet for å endre konteksten på stedet. Og hold konteksten din slank slik at den ikke forstyrrer andre deler av systemet uventet.
Enten du jobber deg gjennom en odoo feltopplæring, bygger et tilpasset modul, eller feilsøker et felt som oppfører seg merkelig, vil forståelse av kontekst alltid være en del av svaret.
Hos Dasolo hjelper vi selskaper med å implementere, tilpasse og optimalisere Odoo for å passe deres virkelige forretningsarbeidsflyter. Hvis du jobber med en tilpasning der kontekst er involvert og du ikke er sikker på at du har det riktig, eller hvis du bare vil snakke gjennom implementeringen din av Odoo, er vi glade for å hjelpe.
Ta kontakt med teamet vårt via kontakt siden og gi oss beskjed om hva du bygger. Vi jobber med bedrifter av alle størrelser for å få Odoo til å fungere slik det skal.