Wprowadzenie
Każdy formularz w Odoo składa się z pól — niektóre trzeba wypełniać za każdym razem, inne można usprawnić ustawiając rozsądne wartości początkowe. Dzięki nim użytkownik otwiera formularz z już wstępnie uzupełnionymi polami, co przyspiesza pracę i zmniejsza liczbę prostych błędów. System wartości domyślnych w Odoo jest intuicyjny, ale ma kilka warstw, które warto poznać przy konfiguracji lub rozszerzaniu systemu.
Niezależnie od tego, czy jesteś użytkownikiem biznesowym zmieniającym pola w Odoo Studio, czy programistą pracującym z modelami w Pythonie, zrozumienie domyślnych wartości oszczędza czas i zapobiega trudnym do wychwycenia pomyłkom konfiguracyjnym.
Poradnik opisuje, czym są wartości domyślne w Odoo, jak są obliczane na poziomie ORM, kiedy używać wartości statycznych lub dynamicznych oraz jak je ustawić za pomocą Odoo Studio lub kodu Python.
Co to jest wartość domyślna w Odoo
W warstwie ORM wartość domyślna to po prostu przypisanie pola podczas tworzenia nowego rekordu, zanim użytkownik cokolwiek wpisze. To nie walidacja ani blokada — użytkownik może ją edytować. Służy jedynie jako punkt startowy, który sprawia, że formularz jest od razu bardziej użyteczny.
Parametr default dostępny jest dla niemal wszystkich typów pól: Char, Integer, Float, Boolean, Date, Many2one, Selection i innych. Może to być stała wartość, lambda Pythona lub referencja do metody — wybór zależy od tego, jakiego zachowania oczekujemy.
W Odoo Studio ustawienie wartości domyślnej wygląda jak zwykłe pole w panelu właściwości — biznesowy użytkownik może ustawić wartość statyczną bez kodowania. To proste rozwiązanie poprawiające spójność danych bez udziału programisty.
W bazie danych wartości domyślne nie trafiają bezpośrednio do kolumn tabel — albo są zdefiniowane w modelu Python, albo przechowywane jako rekordy ir.default. Przy tworzeniu rekordu Odoo odczytuje te ustawienia i wypełnia formularz odpowiednimi wartościami.
Jak działa mechanizm wartości domyślnych
Gdy użytkownik otwiera nowy formularz, system wywołuje default_get() na modelu. Metoda ta zbiera wartości domyślne i zwraca słownik mapujący nazwy pól na wartości, które następnie trafiają do formularza przed jego wyświetleniem.
W Odoo wyróżniamy cztery główne źródła domyślnych wartości — każde służy innemu scenariuszowi użycia.
Wartości statyczne
To proste, jednoznaczne ustawienia: twardo wpisana wartość w definicji pola lub ustawiona w Studio. Przykłady to Boolean ustawiony na True czy Selection ustawiony na 'draft'. Takie domyślne są wystarczające dla większości podstawowych potrzeb biznesowych.
Wartości dynamiczne (lambda/metoda)
Funkcja Pythona lub lambda uruchamiana w momencie tworzenia rekordu pozwala na ustawienia zależne od kontekstu — np. aktualna data, zalogowany użytkownik czy inne parametry środowiska. Dzięki temu pole może domyślnie wskazywać osobę tworzącą rekord albo bieżącą datę.
Poniżej pokazano przykład, jak wyglądają wartości statyczne i dynamiczne w definicji modelu w Pythonie, zgodnie ze standardowym stylem Odoo.
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Wartość statyczna
x_priority_level = fields.Selection(
[('low', 'Niski'), ('medium', 'Średni'), ('high', 'Wysoki')],
string='Poziom Priorytetu',
default='medium',
)
# Wartość dynamiczna: aktualny użytkownik
x_assigned_by = fields.Many2one(
'res.users',
string='Przypisane przez',
default=lambda self: self.env.user,
)
# Wartość dynamiczna: dzisiejsza data
x_expected_date = fields.Date(
string='Przewidywana data zamknięcia',
default=lambda self: fields.Date.today(),
)
Domyślne definiowane przez kontekst
Kiedy uruchamiasz akcję z określonego miejsca w interfejsie, często przekazywany jest kontekst w postaci kluczy default_field_name. Dzięki temu otwarcie formularza z poziomu powiązanego rekordu może automatycznie wstawić relację (np. nowy zadanie otwarte w projekcie będzie miało ustawione pole projektu). To naturalny sposób przekazywania stanu aplikacji bez zmian w modelu.
Wartości domyślne na poziomie użytkownika przez ir.default
Odoo umożliwia też ustawienie wartości domyślnych przypisanych do konkretnego użytkownika przez model ir.default. Administrator może określić osobiste domyślne dla pola i modelu — takie ustawienie ma pierwszeństwo przed domyślną wartością w kodzie i jest przydatne, gdy różne osoby preferują różne ustawienia.
Kolejność nadpisywania wartości domyślnych
Gdy to samo pole ma kilka źródeł domyślnych, Odoo stosuje priorytety: najpierw domyślne ustawienia użytkownika (ir.default), potem ewentualne ustawienia firmy, dalej domyślna wartość zdefiniowana w modelu. Domyślne przekazywane przez kontekst wykonania również potrafią nadpisać ustawienia z kodu. Znajomość tej kolejności ułatwia diagnozowanie, skąd wziął się widoczny na formularzu stan pola.
Przykłady zastosowań w firmie
Wartości domyślne występują praktycznie we wszystkich modułach Odoo — poniżej pięć praktycznych scenariuszy z życia firmy.
CRM: domyślny handlowiec przy nowych leadach
Gdy handlowiec tworzy nowy lead, pole Odpowiedzialny domyślnie ustawiane jest na aktualnie zalogowanego użytkownika. Dzięki temu lead od razu trafia do właściwej osoby, bez dodatkowego kroku. Proste przypisanie użytkownika jako domyślna wartość zwiększa użycie CRM i porządkuje przepływ leadów.
Sprzedaż: domyślne warunki płatności na zamówieniach
Przy tworzeniu zamówienia handlowego Odoo prewypełnia takie pola jak cennik czy warunki płatności na podstawie ustawień kontrahenta. Klient skonfigurowany z terminem płatności 30 dni spowoduje, że każdy nowy dokument dla tego klienta automatycznie otrzyma odpowiednie warunki — zmniejsza to ryzyko pomyłek i zapewnia spójność polityki handlowej.
Magazyn: domyślne lokalizacje przy przesunięciach
Przy tworzeniu przesunięcia wewnętrznego lub korekty magazynowej pola źródłowa i docelowa lokalizacja są domyślnie wypełniane na podstawie ustawień magazynu. Pracownicy magazynu działający stale w tej samej strefie zobaczą prawidłowe lokalizacje od razu po otwarciu formularza, co oszczędza czas i redukuje błędy.
Księgowość: domyślny dziennik przy dokumentach
Podczas tworzenia faktury lub rachunku dostawcy system wybiera odpowiedni dziennik dynamicznie, na podstawie typu dokumentu i konfiguracji firmy. Księgowy nie musi za każdym razem wybierać dziennika ręcznie — domyślna logika pochodzi z ustawień firmy, więc pozostaje poprawna nawet po zmianach konfiguracji.
Project: domyślne stadium przy nowych zadaniach
Nowe zadanie utworzone w projekcie domyślnie trafia do pierwszego etapu kanban projektu. Jeśli zadanie powstaje z poziomu konkretnego projektu, kontekst potrafi też automatycznie ustawić projekt i przypisanie. Dla zespołów zarządzających projektami to duża wygoda — zadania od razu lądują tam, gdzie trzeba.
Tworzenie i modyfikacja wartości domyślnych
Są trzy główne sposoby ustawiania wartości domyślnych w Odoo — od bezkodowego Studio po pełne kontrolowanie za pomocą modułu Python.
Opcja bez kodu: Odoo Studio
Studio daje graficzny interfejs do ustawiania domyślnych wartości na formularzach. To najprostszy sposób, gdy potrzebujesz szybkiej zmiany bez zaangażowania programisty.
- Otwórz Studio na formularzu, który chcesz zmodyfikować
- Kliknij pole, które chcesz skonfigurować
- W panelu właściwości po prawej odnajdź pole Default Value
- Wpisz lub wybierz wartość, którą chcesz ustawić jako domyślną
- Zapisz i wyjdź z trybu Studio
Studio zapisuje takie ustawienie jako rekord ir.default w bazie i zwykle działa globalnie dla firmy, chyba że nałożysz ograniczenie na użytkownika. To świetne rozwiązanie dla domyślnych wartości statycznych w polach Selection, Boolean, Char czy Integer. W przypadku Many2one Studio pozwala wybrać istniejący rekord z listy — praktyczne i szybkie, bez pisania kodu.
Pamiętaj jednak: zmiana domyślnej wartości w Studio nie zmienia już istniejących rekordów — dotyczy tylko nowych utworzonych po zmianie.
Ustawianie przez kod w Pythonie (dla programistów)
W rozwiązaniach technicznych wartości domyślne definiuje się w definicji pola w Pythonie. To daje pełną kontrolę nad statycznymi i dynamicznymi domyślnymi oraz nad logiką odwołującą się do środowiska (np. aktualny użytkownik czy firma). Jest to zalecana metoda, gdy domyślne muszą zależeć od warunków wykonania.
Przykład pokazujący różne typy domyślnych wartości, które można dodać do modułu.
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Statyczne domyślne Boolean
x_requires_review = fields.Boolean(
string='Wymaga przeglądu',
default=False,
)
# Statyczne domyślne Selection
x_delivery_preference = fields.Selection(
[('standard', 'Standardowa'), ('express', 'Ekspres')],
string='Preferencja dostawy',
default='standard',
)
# Domyślne dynamiczne przez metodę
def _default_note(self):
return self.env['ir.config_parameter'].sudo().get_param(
'sale.default_note', default=''
)
x_internal_note = fields.Text(
string='Notatka wewnętrzna',
default=_default_note,
)
Ten wzorzec odpowiada konwencjom Odoo dla pól Pythona i działa dla wszystkich typów pól. Domyślne oparte na metodzie sprawdzają się, gdy logika jest zbyt rozbudowana, by zmieścić się w prostej lambdzie.
Programowe tworzenie rekordów ir.default
Można też tworzyć lub aktualizować rekordy ir.default programowo — przez XML-RPC albo plik danych modułu. Przydatne, jeśli chcesz dostarczyć ustawienia domyślne razem z instalacją modułu. Model ir.default przyjmuje nazwę modelu, nazwę pola, wartość oraz opcjonalnie zakres firmy lub użytkownika.
Ten sposób używany jest rzadziej w codziennym developmentcie, ale bywa niezbędny przy budowie instalowalnych modułów, które mają od razu konfigurację startową.
Dobre praktyki dotyczące wartości domyślnych w Odoo
Ustaw domyślne dla pól wymaganych
Jeśli pole jest obowiązkowe, postaraj się nadać mu sensowną wartość domyślną. Dzięki temu unikniesz błędów przy zapisie nowego rekordu, gdy użytkownik nie zauważy, że pole jest wymagane. Połączenie required=True z praktycznym defaultem to dobry wzorzec.
Używaj lambd dla domyślnych dat
Nigdy nie ustawiaj daty na stałe jako default — użyj lambda self: fields.Date.today(), aby domyślna data zawsze odpowiadała dniu tworzenia rekordu. Stała data szybko stanie się nieaktualna.
Utrzymuj logikę domyślnych lekką
Funkcje ustawiające domyślne wykonują się przy każdym otwarciu nowego formularza, więc unikaj kosztownych zapytań do bazy, wywołań zewnętrznych API czy ciężkich obliczeń. Jeśli potrzebujesz bardziej złożonego zachowania, lepiej użyć onchange lub pola compute wyzwalanego przez inne pole.
Wykorzystuj kontekst dla przepływów nawigacyjnych
Gdy tworzysz akcje lub przyciski otwierające formularze, przekazuj wartości default_field_name w kontekście akcji zamiast polegać na statycznych domyślnych w modelu. To zgodne z natywnymi praktykami Odoo i ułatwia przewidywalne działanie aplikacji.
Testuj domyślne pod różnymi użytkownikami
Domyślne sięgające po self.env.user lub self.env.company będą się różnie zachowywać w zależności od konta. Przetestuj przynajmniej z kilkoma profilami i, jeżeli dotyczy, w konfiguracji multi-company. Co działa dla administratora, może dawać inne efekty dla zwykłego użytkownika.
Częste pułapki
Unikaj mutowalnych obiektów jako domyślnych
Klasyczny błąd Pythona dotyczy ustawiania default=[] lub default={}. W takim przypadku ta sama lista lub słownik jest współdzielony między rekordami, co prowadzi do wycieków danych. Zamiast tego używaj lambdy: default=lambda self: [], aby za każdym razem tworzyć nowy obiekt.
Domyślne nie uruchamiają onchange
Ustawienie domyślnej wartości nie wywoła metod onchange. Jeśli masz logikę zależną od onchange, domyślne ją pominą. Aby wymusić jej wykonanie przy inicjalizacji, trzeba nadpisać default_get i ręcznie uruchomić odpowiednie metody lub przenieść logikę w inne miejsce.
Konflikty między ir.default a definicją modelu
Jeśli domyślna wartość jest ustawiona zarówno w kodzie, jak i przez Studio/rekord ir.default, wygrywa ir.default. To częsty powód nieoczekiwanych wartości widocznych na formularzu — po zmianie w Studio developer może być zaskoczony, że jego ustawienie zostało nadpisane.
Nie zakładaj, że default oznacza wymagane
Wartość domyślna nie czyni pola obowiązkowym. Użytkownik może ją usunąć i zapisać pustą wartość. Jeżeli pole zawsze musi mieć wartość, ustaw dodatkowo required=True.
Unikaj hardkodowania ID użytkowników lub firm
Domyślanie poprzez default=1 (ID rekordu) jest kruchym rozwiązaniem — w innych bazach ten rekord może mieć inny identyfikator. Lepiej używać odwołań dynamicznych: lambda self: self.env.company.id lub lambda self: self.env.ref('module.xml_id').id.
Podsumowanie
Wartości domyślne to niewielkie, ale wpływowe narzędzie w modelu danych Odoo: przyspieszają wprowadzanie danych, wymuszają spójność i poprawiają wygodę użytkowania. Niezależnie czy zastosujesz szybkie poprawki w Studio, czy wprowadzisz eleganckie rozwiązania w Pythonie, znajomość mechanizmu domyślnych pozwoli budować system lepiej dopasowany do procesów firmy.
Najważniejsze przypomnienia: domyślne uruchamiają się tylko przy tworzeniu rekordu, nie wyzwalają onchange, mają określoną kolejność priorytetów źródeł i mutowalne struktury zawsze pakuj w lambdę, by uniknąć współdzielenia stanu.
Poprawne ustawienie wartości domyślnych często decyduje, czy formularz jest szybki i intuicyjny, czy przeciwnie — tworzy codzienną frustrację. Mała praca przy konfiguracji zwraca się przy każdym utworzonym rekordzie.
W Dasolo pomagamy firmom wdrażać, dopasowywać i optymalizować Odoo pod rzeczywiste procesy. Jeśli potrzebujesz wsparcia przy konfiguracji wartości domyślnych, tworzeniu nowych pól lub zaprojektowaniu modelu danych, który naprawdę działa — chętnie pomożemy. Skontaktuj się z nami porozmawiajmy o Twoim wdrożeniu Odoo.