Przejdź do zawartości

Pole Selection w Odoo — Kompletny Przewodnik dla Programistów

Kompletny przewodnik po polu Selection w modelu danych Odoo — od prostego zastosowania po zaawansowane modyfikacje techniczne
6 marca 2026 przez
Pole Selection w Odoo — Kompletny Przewodnik dla Programistów
Dasolo
| Brak komentarzy na ten moment

Wstęp


Za każdym razem, gdy w Odoo ustawiasz priorytet leada, wybierasz sposób płatności lub oznaczasz produkt jako aktywny bądź archiwalny, najprawdopodobniej korzystasz z pola typu Selection. To proste, ale wszechobecne narzędzie, które znacząco wpływa na jakość danych i wygodę pracy z systemem.


W przeciwieństwie do pola tekstowego, w którym użytkownik wpisuje dowolny ciąg znaków, Selection ogranicza wybór do wcześniej zdefiniowanej listy opcji. Ta kontrola wejścia gwarantuje spójność danych, ułatwia filtrowanie i raportowanie oraz minimalizuje błędy wynikające z literówek czy różnych wariantów tego samego opisu.


Ten przewodnik wyjaśnia, co dokładnie pole przechowuje, jak prezentuje się w interfejsie oraz jak je dodać lub dostosować — zarówno z poziomu Odoo Studio, jak i przez moduł w Pythonie czy API XML-RPC. Znajdziesz tu też praktyczne scenariusze użycia oraz listę typowych błędów, których warto unikać.

Czym jest pole Selection w Odoo


W modelu ORM Odoo pole Selection zapisuje w bazie wartość typu tekstowego wybraną spośród ustalonych opcji. Każda opcja to para: techniczny klucz (co trafia do bazy) oraz etykieta widoczna dla użytkownika.


Na przykład pole priorytetu może mieć kilka możliwych wartości:

priority = fields.Selection([
    ('0', 'Normal'),
    ('1', 'Low'),
    ('2', 'High'),
    ('3', 'Very High'),
], string='Priority', default='0')

W tym fragmencie '0', '1', '2' i '3' to klucze zapisywane w bazie, a etykiety Normal, Low, High i Very High to teksty, które widzi użytkownik. Rozdzielenie klucza i etykiety jest kluczowe przy przyszłych zmianach — możesz bezpiecznie zmieniać wyświetlany napis bez łamania istniejących rekordów.


W widoku formularza Selection wyświetla się jako lista rozwijana; w widoku listy pokazana jest etykieta. Jeśli użyjesz widgetu badge, opcje pojawią się jako kolorowe znaczniki — przydatne przy szybkim skanowaniu dużych list.


W Odoo Studio ten typ pola nazywa się Selection. Pola dodane przez Studio otrzymują prefiks x_studio_. Jeśli tworzysz pole w kodzie lub przez API, sam wybierasz nazwę techniczną.

Jak pole działa


W bazie danych Selection to kolumna typu VARCHAR. Zawsze zapisywany jest tylko klucz — nigdy etykieta. To ważne przy tworzeniu filtrów (domain) czy akcji serwerowych: zawsze operuj na kluczach.


Przykładowo, aby wyszukać wszystkie leady o wysokim priorytecie, użyjesz domeny [('priority', '=', '2')], a nie [('priority', '=', 'High')].

Kluczowe atrybuty pola

Poniżej najważniejsze właściwości pola Selection w Odoo:

  • selection: Lista par (klucz, etykieta) definiująca dostępne opcje. Można też podać nazwę metody (jako string), która dynamicznie zwróci listę.
  • default: Klucz opcji używany, gdy pole jest puste. Jeśli nie ustawisz domyślnego, pole zaczyna jako puste.
  • required: Wymusza wybór przed zapisaniem. W połączeniu z domyślną wartością to typowy wzorzec dla pól statusowych.
  • selection_add: Przydatne przy nadpisywaniu modułów — pozwala dodać opcje do istniejącego pola bez przepisywania całej listy. To prawidłowa metoda rozszerzania natywnych pól.
  • ondelete: Używane razem z selection_add do określenia, co się dzieje z rekordami, które mają wartość usuniętej opcji po odinstalowaniu modułu.

Lista statyczna czy dynamiczna

Domyślnie opcje podaje się statycznie w deklaracji pola. Możesz jednak przekazać nazwę metody do parametru selection; Odoo wywoła ją w czasie wykonywania, co pozwala zwrócić inną listę w zależności od aktualnego użytkownika, firmy czy kontekstu.


contract_type = fields.Selection(
    selection='_get_contract_types',
    string='Contract Type'
)

def _get_contract_types(self):
    if self.env.user.has_group('hr.group_hr_manager'):
        return [('permanent', 'Permanent'), ('fixed', 'Fixed Term'), ('interim', 'Interim')]
    return [('permanent', 'Permanent'), ('fixed', 'Fixed Term')]

Jak pole prezentuje się w widokach

W formularzu Selection działa jak standardowa lista rozwijana. Można zastosować widget="badge" — wtedy wartość będzie widoczna jako kolorowa etykieta (szczególnie użyteczne w listach i kanbanach). Dla niewielu opcji sensowne bywa też widget="radio", które pokazuje przyciski radiowe w linii.


Interakcja z ORM Odoo

Odczyt i zapis pól Selection w ORM jest prosty: przypisujesz klucz, a system odwzorowuje go na etykietę w interfejsie. Przy pobieraniu pól przez XML-RPC z fields_get otrzymasz listę par [key, label], którą możesz wykorzystać do własnego renderingu w narzędziach zewnętrznych.


Przykłady zastosowań biznesowych


Pole Selection występuje praktycznie w każdym module standardowego Odoo. Poniżej pięć praktycznych przykładów z biznesu.


CRM: Priorytet leada i typ etapu lejka

Pole priorytetu w CRM ma zwykle kilka poziomów i pomaga zespołom sprzedażowym skupić się na najważniejszych okazjach. Priorytet wpływa na kolorowanie kart w Kanbanie i może uruchamiać automatyzacje — np. przypomnienia czy zadania follow-up, gdy lead zostaje podniesiony w hierarchii. Prawidłowe ustawienie rozkładu priorytetów szybko poprawia jakość danych w CRM.


Sprzedaż: Warunki płatności i zasady fakturowania

Pole invoice_policy na produkcie decyduje, czy fakturowanie odbywa się według ilości zamówionej czy dostarczonej — jedna wartość, duże konsekwencje dla procesu księgowego. Podobnie subskrypcje używają pól Selection do rozróżnienia rozliczeń przedpłata/postpłata. To przykłady Selection, które sterują logiką finansową, a nie tylko opisują rekord.


Magazyn: Stany jakości produktów i partii

W produkcji i kontroli jakości Selectiony śledzą statusy partii, seryjnych numerów czy zleceń naprawczych. Pole stanu zlecenia naprawy przechodzi przez wartości typu draft, confirmed, under repair, ready, done — każda zmiana może uruchamiać maile, ruchy magazynowe czy księgowania. W takim scenariuszu Selection staje się centralnym punktem sterowania workflow.


Księgowość: Sposób płatności i typ dziennika

Typ dziennika w księgowości to Selection rozróżniający sprzedaż, zakupy, gotówkę i bank. System wykorzystuje tę informację przy księgowaniu, wyborze kont i ograniczaniu operacji do odpowiednich dzienników. To przykład pola, które bezpośrednio wpływa na reguły biznesowe.


HR: Rodzaj zatrudnienia i statusy umów

W kadrach Selectiony służą do oznaczania typu zatrudnienia, statusu umowy czy stanu wniosków urlopowych. Zmiana statusu umowy (np. new → open → expired) może uruchamiać powiadomienia dla HR, checklisty wdrożeniowe czy aktualizacje zasad płacowych. Pole przechowuje stan, na którym opierają się wszystkie automatyzacje.

Tworzenie i modyfikowanie pola Selection


Są trzy podstawowe sposoby dodania pola Selection do modelu Odoo — wybór zależy od wymagań wersjonowania i potrzeby automatyzacji wdrożeń.


Odoo Studio (bez kodu)

Odoo Studio to narzędzie low-code do szybkiego dodawania pól bez pisania Pythona. Aby dodać Selection przez Studio:

  1. Otwórz Odoo Studio z głównego menu.
  2. Przejdź do formularza, gdzie chcesz dodać pole.
  3. Przeciągnij pole Selection z paska bocznego na formularz.
  4. W panelu właściwości wpisz opcje, dodając etykietę dla każdej z nich.
  5. Opcjonalnie ustaw wartość domyślną i zaznacz wymagane.
  6. Zapisz i zamknij Studio.

Studio przypisuje każdej opcji auto‑generowany klucz i Twoją etykietę. Pole otrzymuje prefiks x_studio_ i zostaje dodane do widoku. To najszybsza metoda podczas warsztatów z klientem lub szybkich zmian w konfiguracji.


Definiowanie w module Python (dla deweloperów)

Dla deweloperów zalecane jest deklarowanie pól Selection w modułach Python — to podejście umożliwia kontrolę wersji i bezpieczne wdrażanie na wielu środowiskach:

from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_delivery_slot = fields.Selection([
        ('morning', 'Morning (8h - 12h)'),
        ('afternoon', 'Afternoon (13h - 17h)'),
        ('evening', 'Evening (18h - 20h)'),
    ], string='Delivery Slot', default='morning')

Po zdefiniowaniu pola dodajesz je do odpowiedniego pliku XML z widokiem, aby było widoczne w interfejsie. Przy instalacji lub aktualizacji modułu Odoo stworzy kolumnę w bazie automatycznie.


Gdy rozszerzasz natywne pole o nowe wartości, używaj selection_add zamiast redefiniowania całej listy:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    state = fields.Selection(
        selection_add=[('custom_approval', 'Pending Approval')],
        ondelete={'custom_approval': 'set default'}
    )

XML-RPC API

Jeśli automatyzujesz konfigurację lub zarządzasz polami zdalnie (np. w pipeline wdrożeniowym), możesz tworzyć pola Selection przez XML-RPC API:

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_contract_category',
        'field_description': 'Contract Category',
        'model_id': model_id,
        'ttype': 'selection',
        'selection': "[('standard', 'Standard'), ('premium', 'Premium'), ('custom', 'Custom')]",
        'state': 'manual',
    }]
)

Przy tworzeniu pola przez API parametr selection przekazuje się jako string z reprezentacją listy Python. Ustawienie state: 'manual' oznacza, że pole zostało stworzone ręcznie — tak powinno być dla pól ze Studio lub API. Takie podejście umożliwia automatyczne tworzenie pól w skryptach konfiguracyjnych.


Dobre praktyki


1. Stosuj czytelne i trwałe klucze

To klucz trafia do bazy i będzie używany w filtrach, akcjach automatycznych i logice po stronie serwera. Wybieraj opisowe, niezmienne nazwy: 'draft', 'confirmed', 'cancelled'. Unikaj kluczy liczbowych, jeśli tylko nie mają realnego znaczenia — utrudniają późniejsze zrozumienie kodu.


2. Utrzymuj krótką, kompletną listę

Jeżeli Selection ma więcej niż 8–10 opcji, najczęściej oznacza to, że próbuje pełnić zbyt wiele ról. Rozważ relację Many2one do modelu konfiguracyjnego, jeśli lista rozwija się często — wtedy użytkownicy sami będą mogli nią zarządzać bez ingerencji dewelopera.


3. Dla pól wymaganych ustaw domyślną wartość

Gdy pole jest required, podaj sensowny default. Zapobiega to błędom walidacji przy tworzeniu rekordów przez importy, API lub skrypty, gdzie brak użytkownika interaktywnego. Domyślna wartość powinna odzwierciedlać najczęstszy lub najmniej zobowiązujący stan.


4. Rozszerzaj istniejące pola przez selection_add

Jeśli dodajesz wartości do natywnego pola, korzystaj z selection_add zamiast przepisywać całą definicję. To bezpieczniejsze i bardziej kompatybilne z innymi modułami. Zawsze dołącz ondelete definiujące zachowanie po odinstalowaniu Twojego modułu.


5. Używaj widgetu badge dla lepszej widoczności

W widokach list i kanban domyślny tekst może ginąć w gąszczu danych. Dodając widget="badge", zmieniasz wartości w kolorowe etykiety, co ułatwia szybkie przeglądanie statusów i identyfikację rekordów wymagających uwagi.


Częste pułapki


Zmiana klucza niszczy istniejące dane

Etykietę możesz bezpiecznie edytować, bo w bazie przechowywany jest tylko klucz. Jednak zmiana klucza po pojawieniu się rekordów z tą wartością spowoduje, że te rekordy będą miały nieprawidłowy lub pusty stan, a filtry i automatyzacje przestaną działać. Jeśli naprawdę musisz zmienić klucz, przygotuj migrację danych aktualizującą wszystkie istniejące rekordy.


Usunięcie opcji pozostawia rekordy z nieznaną wartością

Gdy usuniesz opcję, a rekordy nadal ją mają, pokażą one brakującą lub błędną wartość. Przed usunięciem przeprowadź zapytanie wyszukujące używane przypadki i zaktualizuj lub zarchiwizuj te rekordy — to częsty problem przy porządkowaniu danych.


Filtrowanie po etykiecie zamiast po kluczu

Częstym błędem, zwłaszcza przy tworzeniu reguł w interfejsie, jest filtrowanie po widocznej etykiecie zamiast po kluczu. Taki filtr zwróci 0 wyników, nie dając oczywistego błędu, co utrudnia diagnozę. Zawsze sprawdź definicję pola, aby dopasować właściwy klucz.


Selection tam, gdzie lepszy byłby Many2one

Jeśli lista opcji zmienia się często, użytkownicy powinni móc nią zarządzać samodzielnie lub każda opcja ma dodatkowe atrybuty (kolor, sekwencja, konto), lepszym rozwiązaniem jest Many2one do modelu konfiguracyjnego. Selectiony sprawdzają się przy stabilnych, zarządzanych przez dewelopera listach.


Brak obsługi wartości pustej w logice serwerowej

Pole Selection, jeśli nie jest wymagane, może mieć wartość False. Jeśli skrypty porównują wartość bez sprawdzenia pustego stanu, pojawią się błędy lub nieoczekiwane zachowanie. Zawsze obsługuj przypadek, gdy pole jest puste, w akcjach serwerowych i polach obliczanych.

Podsumowanie


Na pierwszy rzut oka Selection wydaje się prosty, ale ma wiele niuansów, które wpływają na skalowalność i utrzymanie systemu. Zrozumienie różnicy między kluczem a etykietą, wiedza kiedy użyć selection_add zamiast redefinicji oraz kiedy sięgnąć po Many2one — to elementy, które odróżniają dobrze zaprojektowane wdrożenie Odoo od takiego, które będzie generować problemy za rok.


Niezależnie od tego, czy dodajesz typ umowy przez Studio, tworzysz pole okna dostawy w module Python, czy konfigurujesz statusy jakości przez API — opisane wzorce pomogą podjąć właściwą decyzję dla konkretnego przypadku użycia.

W modelu danych Odoo pole Selection to podstawowe narzędzie do egzekwowania jakości danych u źródła. Dobrze zastosowane utrzymuje rekordy w czystości, raporty w poprawności, a automatyzacje w wiarygodności.

W Dasolo pomagamy firmom wdrażać, dostosowywać i optymalizować Odoo w całej organizacji. Jeśli potrzebujesz wsparcia przy projektowaniu modelu danych, dodawaniu niestandardowych pól czy budowie modułu od podstaw, mamy zespół, który to zrobi. Skontaktuj się z nami porozmawiajmy o Twoim projekcie Odoo.

Pole Selection w Odoo — Kompletny Przewodnik dla Programistów
Dasolo 6 marca 2026
Udostępnij ten artykuł
Zaloguj się by zostawić komentarz