Inleiding
Elke keer dat een gebruiker een leadprioriteit kiest, een betaalmethode selecteert of een product als actief of gearchiveerd markeert in Odoo, interacteert hij of zij waarschijnlijk met een Selectieveld. Het is een van de meest praktische veldtypes in het Odoo-framework en een van de belangrijkste om te begrijpen als je schone, betrouwbare datamodellen wilt bouwen.
In tegenstelling tot een vrij tekstveld waar gebruikers alles kunnen typen, beperkt het Selectieveld de invoer tot een vooraf gedefinieerde lijst van keuzes. Die beperking is het hele punt. Het houdt je gegevens consistent, maakt filteren en rapporteren nauwkeuriger en voorkomt het soort typfouten en variaties die in de loop van de tijd stilletjes aggregaties en dashboards breken.
Deze gids behandelt alles, van wat het veld opslaat en hoe het in de interface verschijnt, tot het maken en aanpassen ervan via Odoo Studio, Python-modules of de XML-RPC API. Je vindt ook praktische voorbeelden uit echte zakelijke workflows en een lijst van veelvoorkomende fouten om te vermijden.
Wat is het Selectieveld in Odoo
In de Odoo ORM slaat het Selectieveld een tekenreekswaarde op die is gekozen uit een vaste lijst van opties. Elke optie is gedefinieerd als een sleutel-waarde paar: de sleutel is wat in de database wordt opgeslagen, en het label is wat de gebruiker in de interface ziet.
Bijvoorbeeld, een prioriteitsveld kan gedefinieerd worden met de volgende opties:
priority = fields.Selection([
('0', 'Normaal'),
('1', 'Laag'),
('2', 'Hoog'),
('3', 'Zeer Hoog'),
], string='Prioriteit', default='0')
In dit voorbeeld zijn '0', '1', '2' en '3' de sleutels die in de database zijn opgeslagen. De labels Normaal, Laag, Hoog en Zeer Hoog zijn wat gebruikers op het scherm zien. Deze scheiding is belangrijk wanneer het gaat om het later wijzigen van labels zonder bestaande records te breken.
In de interface verschijnt een Selectieveld als een dropdownlijst in formulierweergaven. In lijstweergaven toont het het menselijk leesbare label. Bij gebruik van de badge widget wordt elke optie weergegeven als een gekleurde tag, waardoor de waarde onmiddellijk zichtbaar is in dichte lijstweergaven.
In Odoo Studio wordt dit veldtype een Selectie veld genoemd. Wanneer het via Studio wordt aangemaakt, krijgt het een x_studio_ prefix. Wanneer het via code of de XML-RPC API wordt aangemaakt, kies je de technische naam.
Hoe het veld werkt
In het Odoo datamodel worden Selectievelden opgeslagen in PostgreSQL als een VARCHAR kolom. De database slaat alleen de sleutel op, nooit het label. Dit is belangrijk om in gedachten te houden bij het schrijven van domeinfilters of serveracties, aangezien je de sleutel moet gebruiken, niet de menselijk leesbare waarde.
Bijvoorbeeld, om te zoeken naar alle leads met hoge prioriteit, zou je domein [('priority', '=', '2')] zijn, niet [('priority', '=', 'Hoog')].
Sleutelveld Attributen
Hier zijn de belangrijkste eigenschappen van een Selectieveld in het Odoo-framework:
- selection: De lijst van
(sleutel, label)tuples die de beschikbare opties definiëren. Dit kan ook een methodenaam (string) zijn die dynamisch een lijst retourneert. - default: De sleutel van de optie die moet worden gebruikt wanneer er nog geen waarde is ingesteld. Als dit wordt weggelaten, begint het veld leeg.
- required: Dwingt de gebruiker om een optie te kiezen voordat deze opslaat. In combinatie met een standaardwaarde is dit een veelvoorkomend patroon voor statusvelden.
- selection_add: Gebruikt in module-erfelijkheid om nieuwe opties toe te voegen aan een bestaand Selectieveld zonder de hele lijst opnieuw te definiëren. Dit is de juiste aanpak bij het uitbreiden van een native veld.
- ondelete: Werkt samen met
selection_addom te definiëren wat er gebeurt met records met een verwijderde optie wanneer de module die deze heeft toegevoegd, wordt verwijderd.
Statische vs Dynamische Selectielijsten
Standaard wordt de lijst met opties statisch gedefinieerd in de veldverklaring. Maar je kunt ook een methodenaam als een string doorgeven aan de selection parameter. Odoo zal die methode tijdens runtime aanroepen om de lijst op te bouwen, wat je in staat stelt om verschillende opties weer te geven afhankelijk van de huidige gebruiker, het huidige bedrijf of enige andere context.
contract_type = fields.Selection(
selection='_get_contract_types',
string='Contracttype'
)
def _get_contract_types(self):
if self.env.user.has_group('hr.group_hr_manager'):
return [('permanent', 'Permanent'), ('fixed', 'Vast',), ('interim', 'Interim')]
return [('permanent', 'Permanent'), ('fixed', 'Vast')]
Hoe het Eruitziet in Weergaven
In een formulierweergave wordt een Selectieveld weergegeven als een standaard dropdown. Je kunt ook de widget="badge" attribuut gebruiken om het weer te geven als een gekleurde label, wat goed werkt in lijst- en kanbanweergaven voor statusvelden. De widget="radio" attribuut geeft de opties weer als inline radioknoppen, wat geschikt is voor velden met een klein aantal keuzes waarbij je alle opties tegelijk zichtbaar wilt hebben.
Interactie met de Odoo ORM
Het lezen en schrijven van Selectievelden in de Odoo ORM werkt eenvoudig. Je wijst de sleutel direct toe, en het framework beheert de weergave mapping automatisch. Bij het lezen van een record via de XML-RPC API met fields_get, bevat de selection attribuut van het veld de volledige lijst van [key, label] paren, die je kunt gebruiken om je eigen weergavelogica in externe tools op te bouwen.
Zakelijke gebruiksscenario's
Het Selectieveld verschijnt in vrijwel elke module in een standaard Odoo-implementatie. Hier zijn vijf concrete voorbeelden uit veelvoorkomende bedrijfsworkflows.
CRM: Leadprioriteit en Pipeline Fase Type
Het prioriteitsveld op CRM-leads is een native Selectieveld met vier niveaus: Normaal, Laag, Hoog en Zeer Hoog. Verkoopteams gebruiken het om hun aandacht te richten op de meest veelbelovende kansen. Het voedt direct de kleurcodering van de Kanban-weergave en kan worden gebruikt in geautomatiseerde acties om vervolgacties te triggeren wanneer een lead wordt geëscaleerd. Het goed krijgen van de prioriteitsverdeling is een van de eerste verbeteringen in datakwaliteit die de meeste CRM-teams maken na de livegang.
Verkoop: Betalingsvoorwaarden en Facturatiebeleid
Het invoice_policy veld op producten is een selectievak dat bepaalt of facturering is gebaseerd op bestelde hoeveelheden of geleverde hoeveelheden. Dit enkele veld bepaalt de gehele facturatiestroom voor een product. Evenzo gebruikt de factureringsmodus op abonnementscontracten een selectievak om te onderscheiden tussen prepaid en postpaid factureringscycli. Beide zijn goede voorbeelden van selectievakken die aanzienlijke downstreamgevolgen hebben voor financiële workflows.
Voorraad: Product- en Partijkwaliteitsstatussen
In productie- en kwaliteitscontroleworkflows worden selectievakken gebruikt om de status van partijen, serienummers en reparatieorders bij te houden. Het veld voor de status van de reparatieorder, bijvoorbeeld, beweegt door waarden zoals concept, bevestigd, in reparatie, gereed en voltooid. Elke overgang kan geautomatiseerde e-mails, voorraadbewegingen of boekhoudkundige invoeren triggeren. Het selectievak fungeert als het controlepunt waar de gehele workflow omheen is gebouwd.
Boekhouding: Betalingsmethode en Journaaltype
Het journaaltypeveld in Odoo Boekhouding is een selectievak dat onderscheid maakt tussen verkoopjournaals, aankoopjournaals, kasjournaals en bankjournaals. Odoo gebruikt deze waarde om de juiste boekingslogica toe te passen, te bepalen welke rekeningen beschikbaar zijn en bepaalde operaties te beperken tot de juiste journaaltypes. Dit is een goed voorbeeld van een selectievak dat bedrijfsregels controleert in plaats van alleen een record te labelen.
HR: Werktype en Contractstatus
HR-teams gebruiken selectievakken om werktypes, contractstatussen en status van verlofaanvragen bij te houden. De contractstatus, bijvoorbeeld, beweegt van nieuw naar open naar verlopen of geannuleerd. Automatiseringen kunnen de HR-manager een maand voor de vervaldatum van een contract notificeren, onboarding-checklists activeren wanneer een nieuwe werknemer begint, en loonregels bijwerken op basis van het werktype. Het selectievak houdt de status vast die al deze logica aandrijft.
Een Selectieveld maken of aanpassen
Er zijn drie hoofdmanieren om een selectievak aan een Odoo-model toe te voegen, afhankelijk van uw setup en of u de wijziging versiebeheer wilt of programmatisch wilt toepassen.
Gebruik Odoo Studio (Geen Code)
Odoo Studio is de ingebouwde low-code tool voor het toevoegen van velden zonder Python te schrijven. Om een selectievak via Studio toe te voegen:
- Open Odoo Studio vanuit het hoofdmenu.
- Navigeer naar het formulier waar je het veld wilt toevoegen.
- Sleep een Selectie veld vanuit de zijbalk naar het formulier.
- Voeg je opties toe in het eigenschappenpaneel van het veld, en voer een label in voor elke keuze.
- Stel optioneel een standaardwaarde in en markeer het veld als verplicht.
- Sla Studio op en sluit het.
Studio slaat elke optie op met een automatisch gegenereerde sleutel en het label dat je hebt opgegeven. Het veld krijgt een x_studio_ voorvoegsel en wordt automatisch aan de formulierweergave toegevoegd. Dit is de snelste manier om een Selectieveld toe te voegen tijdens een bedrijfsanalyse-sessie met een klant.
Python gebruiken in een Aangepaste Module
Voor ontwikkelaars die Odoo-modules bouwen, worden Selectievelden gedefinieerd in Python-modelbestanden. Dit is de aanbevolen aanpak voor aanpassingen die versiebeheer nodig hebben en over meerdere omgevingen moeten worden uitgerold:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
x_delivery_slot = fields.Selection([
('morning', 'Ochtend (8u - 12u)'),
('afternoon', 'Middag (13u - 17u)'),
('evening', 'Avond (18u - 20u)'),
], string='Leveringsslot', default='morning')
Nadat je het veld hebt gedefinieerd, voeg je het toe aan het relevante weergave-XML-bestand zodat het in de interface verschijnt. Odoo beheert de creatie van de databasekolom wanneer je de module installeert of bijwerkt.
Wanneer je een native veld uitbreidt met nieuwe opties, gebruik dan selection_add in plaats van het veld opnieuw te definiëren:
class SaleOrder(models.Model):
_inherit = 'sale.order'
state = fields.Selection(
selection_add=[('custom_approval', 'In afwachting van goedkeuring')],
ondelete={'custom_approval': 'standaard instellen'}
)
Gebruik de XML-RPC API
Als je Odoo-aanpassingen programmatisch beheert, bijvoorbeeld als onderdeel van een implementatiepipeline of een remote configuratienotitieboek, kun je Selectievelden aanmaken via de XML-RPC API:
field_id = models.execute_kw(
ODOO_DB, uid, ODOO_API_KEY,
'ir.model.fields', 'create',
[{
'name': 'x_contract_category',
'field_description': 'Contractcategorie',
'model_id': model_id,
'ttype': 'selection',
'selection': "[('standard', 'Standaard'), ('premium', 'Premium'), ('custom', 'Aangepast')]",
'state': 'manual',
}]
)
Let op dat wanneer je een Selectieveld via de API aanmaakt, de selection waarde wordt doorgegeven als een stringrepresentatie van de Python-lijst. De state: manual waarde vertelt Odoo dat dit veld handmatig is aangemaakt, wat de juiste instelling is voor velden die zijn aangemaakt via Studio of de API. Dit is hoe Dasolo de creatie van remote velden voor klanten afhandelt als onderdeel van geautomatiseerde configuratiescripts.
Beste praktijken
1. Gebruik betekenisvolle en stabiele sleutels
De sleutel is wat in de database wordt opgeslagen en gebruikt in domeinfilters, geautomatiseerde acties en server-side logica. Kies een sleutel die de optie duidelijk beschrijft en die je later niet hoeft te wijzigen. Korte kleine letters werken goed: 'draft', 'confirmed', 'cancelled'. Vermijd numerieke sleutels, tenzij de volgorde echt belangrijk is, omdat ze je code moeilijker leesbaar en begrijpelijk maken maanden later.
2. Houd de lijst kort en uitputtend
Een Selectieveld met meer dan acht of tien opties is meestal een teken dat het veld te veel probeert te doen. Als de lijst blijft groeien, overweeg dan of een Many2one-relatie met een configuratiemodel geschikter zou zijn. Dit geeft gebruikers de mogelijkheid om de opties zelf via de interface te beheren, zonder dat een ontwikkelaar code of een databasevelddefinitie hoeft bij te werken.
3. Stel altijd een standaard in voor vereiste velden
Als een Selectieveld vereist is, stel dan ook een zinvolle standaardwaarde in. Dit voorkomt validatiefouten wanneer records programmatisch worden aangemaakt, via imports of via de API, waar de gebruiker niet aanwezig is om een selectie te maken. De standaard moet de meest voorkomende of minst betrokken staat in de workflow vertegenwoordigen.
4. Gebruik selection_add bij het uitbreiden van native velden
Als je opties wilt toevoegen aan een bestaand Odoo-veld in een aangepaste module, gebruik dan selection_add in plaats van het volledige veld opnieuw te definiëren. Dit is veiliger en meer compatibel met andere modules die mogelijk ook hetzelfde veld uitbreiden. Koppel het altijd met de ondelete parameter om te regelen wat er gebeurt wanneer je module wordt verwijderd.
5. Gebruik de badge-widget voor zichtbaarheid in lijstweergaven
In lijst- en kanbanweergaven is de standaardweergave van een Selectieveld gewoon tekst. Door de widget="badge" eigenschap in de weergave-XML toe te voegen, wordt elke waarde omgezet in een gekleurde label, waardoor het veld veel gemakkelijker te scannen is in één oogopslag. Dit is vooral nuttig voor statusvelden waar gebruikers snel records moeten identificeren die aandacht nodig hebben.
Veelvoorkomende valkuilen
Een sleutel wijzigen breekt bestaande gegevens
Het label van een Selectieoptie kan op elk moment veilig worden gewijzigd, aangezien alleen de sleutel in de database is opgeslagen. De sleutel mag echter nooit veranderen zodra er records met die waarde bestaan. Als je een sleutel hernoemt, zullen alle bestaande records met de oude sleutel een lege of ongeldige waarde in de interface weergeven, en eventuele domeinfilters of automatiseringen die de oude sleutel gebruiken, zullen stilletjes stoppen met werken. Als een sleutel echt moet veranderen, moet je eerst een datamigratiescript uitvoeren om alle bestaande records bij te werken.
Een optie verwijderen laat weesrecords achter
Als je een optie uit de lijst verwijdert terwijl records nog die sleutel hebben, zullen die records een ontbrekende of gebroken waarde tonen. Zoek voordat je een optie verwijdert naar records die deze nog gebruiken en werk ze bij naar een geldige waarde of archiveer ze. Dit is een veelvoorkomend probleem tijdens datacleanup-projecten wanneer de lijst met opties is ontworpen zonder voldoende voorafgaande analyse.
Gebruik het label in plaats van de sleutel in domeinfilters
Een veelvoorkomende fout, vooral voor minder technische gebruikers die automatiseringsregels in de Odoo-interface schrijven, is om te filteren op het menselijk leesbare label in plaats van de opgeslagen sleutel. Dit produceert een domein dat nul resultaten retourneert zonder een foutmelding te geven, wat moeilijk te diagnosticeren kan zijn. Controleer altijd de velddefinitie om te bevestigen welke sleutel overeenkomt met welk label voordat je een filter schrijft.
Een Selectieveld gebruiken waar een Many2one meer geschikt is
Als de lijst met opties vaak verandert, als gebruikers deze zelf moeten beheren zonder betrokkenheid van een ontwikkelaar, of als de opties extra attributen hebben zoals een kleur, een volgorde of een gekoppeld account, dan is een Many2one-relatie met een configuratiemodel de betere keuze. Selectievelden zijn ideaal voor stabiele, door ontwikkelaars beheerde lijsten. Voor alles wat dynamischer is, is Many2one op de lange termijn beter onderhoudbaar.
De lege waarde niet afhandelen in server-side logica
Een Selectieveld dat niet verplicht is, kan een False waarde bevatten wanneer er geen optie is geselecteerd. Als je Python-code of een geautomatiseerde actie de veldwaarde vergelijkt met een string zonder eerst te controleren op False, krijg je onverwacht gedrag of fouten. Zorg ervoor dat je de lege situatie expliciet afhandelt in serveracties en berekende velden die afhankelijk zijn van een Selectieveld.
Conclusie
Het Selectieveld is een van die veldtypes die eenvoudig lijken, maar echte diepgang hebben zodra je begrijpt hoe het onder de motorkap werkt. Het kennen van het verschil tussen een sleutel en een label, begrijpen wanneer je selection_add moet gebruiken in plaats van een veld opnieuw te definiëren, en herkennen wanneer een Many2one je beter van dienst zou zijn, zijn de soorten onderscheidingen die een goed ontworpen Odoo-implementatie scheiden van een die problemen veroorzaakt een jaar later.
Of je nu een contracttype toevoegt via Odoo Studio, een leveringsslotveld definieert in een aangepaste Python-module, of een kwaliteitsstatusveld creëert via de API, de patronen die in deze gids worden beschreven, geven je wat je nodig hebt om de juiste beslissing te nemen voor jouw gebruiksgeval.
In het Odoo-datamodel is het Selectieveld een van de belangrijkste hulpmiddelen voor het handhaven van datakwaliteit aan de bron. Goed gebruikt, houdt het je records schoon, je rapporten nauwkeurig en je automatiseringen betrouwbaar.
Bij Dasolo helpen we bedrijven bij het implementeren, aanpassen en optimaliseren van Odoo in alle afdelingen. Of je nu hulp nodig hebt bij het ontwerpen van een schoon datamodel, het toevoegen van aangepaste velden aan je workflows, of het bouwen van een volledige Odoo-module vanaf nul, ons team staat klaar om te helpen. Neem contact met ons op en laten we praten over jouw Odoo-project.