Εισαγωγή
Κάθε φόρμα στο Odoo περιλαμβάνει πεδία — κάποια συμπληρώνονται κάθε φορά από τον χρήστη, άλλα όμως μπορούν να ξεκινούν αυτόματα με μια λογική τιμή. Η «προεπιλεγμένη τιμή» είναι αυτό το αρχικό περιεχόμενο που κάνει τη φόρμα πρακτικά έτοιμη οπότε ο χρήστης δεν ξεκινά από το μηδέν. Η ιδέα είναι απλή, όμως πίσω απ’ αυτήν υπάρχει λογική και κανόνες που αξίζει να γνωρίζει όποιος διαμορφώνει ή προσαρμόζει φόρμες για την ομάδα του.
Είτε δουλεύεις σαν λειτουργικός χρήστης που αλλάζει ένα πεδίο μέσω Odoo Studio, είτε σαν προγραμματιστής που γράφει Python για το μοντέλο, η σωστή χρήση των προεπιλογών εξοικονομεί χρόνο και αποφεύγει δυσδιάκριτα σφάλματα ρυθμίσεων που εμφανίζονται αργότερα.
Ο οδηγός αυτός εξηγεί τι είναι οι προεπιλεγμένες τιμές στο Odoo, πώς εξάγονται από το ORM, πότε προτιμάμε στατικές έναντι δυναμικών προεπιλογών, και πώς να τις ρυθμίσουμε είτε με Studio είτε με κώδικα Python.
Τι σημαίνει «προεπιλεγμένη τιμή» στο Odoo
Σε επίπεδο ORM, προεπιλεγμένη τιμή είναι αυτό που μπαίνει σε ένα πεδίο όταν δημιουργείται ένα νέο εγγραφή πριν ο χρήστης γράψει οτιδήποτε. Δεν είναι περιορισμός — ο χρήστης μπορεί απλώς να το αλλάξει. Σκοπός της είναι να δώσει ένα χρήσιμο ξεκίνημα και να κάνει τη φόρμα πιο λειτουργική εξαρχής.
Το όρισμα default υπάρχει σε σχεδόν όλους τους τύπους πεδίων στο Odoo — Char, Integer, Float, Boolean, Date, Many2one, Selection κ.λπ. Μπορεί να δοθεί ως απλή τιμή, ως Python lambda ή ως αναφορά σε μέθοδο. Όλοι αυτοί οι τρόποι είναι έγκυροι ανάλογα με την περίπτωση χρήσης.
Στο Odoo Studio, οι προεπιλογές εμφανίζονται στην πλαϊνή παλέτα ιδιοτήτων του πεδίου ως ένα απλό πεδίο εισόδου. Ένας μη τεχνικός χρήστης μπορεί να ορίσει στατική προεπιλογή χωρίς γραφή κώδικα, κάτι που κάνει το Studio εργαλείο άμεσα προσβάσιμο για να βελτιώσεις την ποιότητα των δεδομένων χωρίς ανάγκη προγραμματιστή.
Στον πίνακα δεδομένων, οι προεπιλογές δεν αποθηκεύονται σαν στήλες του πεδίου. Βρίσκονται είτε στον ορισμό του Python μοντέλου είτε σαν εγγραφές ir.default στη βάση, ανάλογα με τον τρόπο που ορίστηκαν. Όταν δημιουργείται νέα εγγραφή, το Odoo διαβάζει αυτές τις ρυθμίσεις και προ-συμπληρώνει τη φόρμα πριν τη δει ο χρήστης.
Πώς λειτουργεί η προεπιλεγμένη τιμή
Κατά το άνοιγμα μιας νέας φόρμας, το πλαίσιο καλεί τη μέθοδο default_get() στο μοντέλο. Η μέθοδος συγκεντρώνει τις προεπιλογές και επιστρέφει λεξικό (dictionary) που συνδέει ονόματα πεδίων με τις τιμές τους. Η φόρμα χρησιμοποιεί αυτά τα δεδομένα για να προ-συμπληρώσει τα πεδία.
Υπάρχουν τέσσερις βασικές κατηγορίες προεπιλογών στο Odoo, κάθε μία εξυπηρετεί διαφορετικό σενάριο.
Στατικές προεπιλογές
Είναι σταθερές τιμές που ορίζονται στον ορισμό του πεδίου ή μέσω Studio — για παράδειγμα ένα Boolean με default True ή μια επιλογή με default 'draft'. Είναι οι απλούστερες και επαρκούν για τα περισσότερα καθημερινά σενάρια μοντελοποίησης δεδομένων.
Δυναμικές προεπιλογές με Lambda ή Μέθοδο
Πρόκειται για συναρτήσεις Python που εκτελούνται κατά τη δημιουργία της εγγραφής. Επιτρέπουν την προεπιλογή να εξαρτάται από την τρέχουσα ημερομηνία, τον συνδεδεμένο χρήστη ή το context. Παραδείγματα: να ορίζεται ως υπεύθυνος ο τρέχων χρήστης ή να μπαίνει αυτομάτως η σημερινή ημερομηνία.
Παρακάτω βλέπεις τη βασική ιδέα για το πώς μοιάζουν στατικές και δυναμικές προεπιλογές σε έναν Python ορισμό πεδίου, ακολουθώντας τα συνήθη patterns ανάπτυξης στο Odoo:
from odoo import fields, models
class CrmLead(models.Model):
_inherit = 'crm.lead'
# Στατική προεπιλογή
x_priority_level = fields.Selection(
[('low', 'Χαμηλό'), ('medium', 'Μέτριο'), ('high', 'Υψηλό')],
string='Επίπεδο Προτεραιότητας',
default='medium',
)
# Δυναμική προεπιλογή: τρέχων χρήστης
x_assigned_by = fields.Many2one(
'res.users',
string='Ανατέθηκε από',
default=lambda self: self.env.user,
)
# Δυναμική προεπιλογή: σημερινή ημερομηνία
x_expected_date = fields.Date(
string='Αναμενόμενη Ημερομηνία Κλεισίματος',
default=lambda self: fields.Date.today(),
)
Προεπιλογές με βάση το context
Μπορείς να περάσεις τιμές μέσω του action context χρησιμοποιώντας τη σύμβαση default_field_name. Όταν δημιουργείς νέα εγγραφή από συσχετισμένο εγγραφής, το Odoo συχνά περνάει context που γεμίζει relational πεδία — π.χ. νέος task μέσα σε project βάζει αυτόματα το project πεδίο. Αυτή η συμπεριφορά οργανώνει τη ροή πλοήγησης και μπορεί να προσαρμοστεί από τον προγραμματιστή ή τον power user.
Προεπιλογές ανά χρήστη μέσω ir.default
Το Odoo επιτρέπει επίσης προσωπικές προεπιλογές με εγγραφές ir.default. Ένας διαχειριστής μπορεί να ορίσει προεπιλογή για συγκεκριμένο χρήστη και μοντέλο. Όταν εκείνος ο χρήστης δημιουργήσει νέο εγγραφή, η προσωπική του προεπιλογή έχει προτεραιότητα έναντι της προεπιλογής σε επίπεδο μοντέλου. Αυτό είναι ιδιαίτερα χρήσιμο σε οργανισμούς όπου κάθε ρόλος ή χρήστης προτιμά διαφορετική συμπεριφορά φόρμας.
Σειρά προτεραιότητας
Όταν υπάρχουν πολλαπλές πηγές προεπιλογών για το ίδιο πεδίο, το Odoo τις επιλύει ως εξής: πρώτα οι χρήστη-ειδικές ir.default, μετά οι εταιρικές ir.default, και στο τέλος η προεπιλογή από τον Python ορισμό του μοντέλου. Επιπλέον, το context που περνάει κατά τη δημιουργία (runtime) υπερισχύει των μοντέλων. Η γνώση αυτής της σειράς βοηθάει να καταλάβεις γιατί ένα πεδίο δεν εμφανίζει την αναμενόμενη τιμή στη φόρμα.
Πρακτικά επιχειρησιακά σενάρια
Οι προεπιλογές εμφανίζονται σε σχεδόν όλα τα modules του Odoo. Ακολουθούν πέντε πρακτικά παραδείγματα από ροές εργασίας επιχειρήσεων.
CRM: προεπιλεγμένος πωλητής σε νέα leads
Όταν κάποιος πωλητής δημιουργεί lead ή opportunity, το πεδίο Responsible συχνά παίρνει ως προεπιλογή τον τρέχοντα χρήστη. Έτσι τα leads δεν ξεκινούν ανεπιθύμητα χωρίς υπεύθυνο. Αυτή η μικρή ρύθμιση — default = self.env.user — αυξάνει την υιοθέτηση του CRM, γιατί οι χρήστες βλέπουν αμέσως τις εγγραφές που τους αφορούν.
Πωλήσεις: προεπιλεγμένοι όροι πληρωμής σε παραγγελίες
Σε μια πώληση, πεδία όπως τιμοκατάλογος και όροι πληρωμής προεπιλέγονται από τη ρύθμιση του πελάτη. Αν ένας πελάτης έχει Net 30, κάθε νέα παραγγελία θα έχει αυτό το πεδίο συμπληρωμένο. Αυτό μειώνει λάθη στην επιλογή και διασφαλίζει ότι οι συμφωνημένοι όροι εφαρμόζονται συνεπώς ανεξάρτητα από ποιος δημιουργεί την παραγγελία.
Αποθήκη: προεπιλεγμένες τοποθεσίες σε μεταφορές
Στις εσωτερικές μεταφορές ή τις προσαρμογές αποθέματος, οι πεδία πηγή και προορισμού προεπιλέγονται από τις ρυθμίσεις της αποθήκης. Οι υπάλληλοι αποθήκης που δουλεύουν πάντα στην ίδια ζώνη βρίσκουν ήδη την σωστή τοποθεσία επιλεγμένη, μειώνοντας κλικ και το ρίσκο λάθους όταν δουλεύουν γρήγορα.
Λογιστήριο: προεπιλεγμένο ημερολόγιο σε εγγραφές
Κατά τη δημιουργία νέας τιμολόγησης ή λογιστικής εγγραφής, το Odoo επιλέγει το κατάλληλο ημερολόγιο ανάλογα με τον τύπο εγγραφής και τη ρύθμιση της εταιρείας. Έτσι ο λογιστής δεν χρειάζεται να διαλέγει χειροκίνητα το ημερολόγιο κάθε φορά. Η προεπιλογή προκύπτει δυναμικά από τις εταιρικές ρυθμίσεις και παραμένει σωστή ακόμα και αν αλλάξουν αργότερα τα ημερολόγια.
Project: προεπιλεγμένο στάδιο σε νέα tasks
Όταν δημιουργείται task μέσα σε project, αυτό μπαίνει στο πρώτο στάδιο του kanban της συγκεκριμένης ομάδας. Αν το task ανοίγει από το κουμπί του project, το context μπορεί να συμπληρώσει και τον υπεύθυνο. Αυτές οι προεπιλογές κρατούν τα νέα tasks στη σωστή στήλη από την αρχή και μειώνουν την ανάγκη χειροκίνητης τακτοποίησης.
Πώς να ορίσετε ή να προσαρμόσετε προεπιλεγμένες τιμές
Υπάρχουν τρεις βασικοί τρόποι να ορίσεις προεπιλογές στο Odoo: από Studio χωρίς κώδικα, με Python σε τεχνικό module, ή προγραμματικά μέσω ir.default όταν μοιράζεις ρυθμίσεις με ένα module.
Χρήση Odoo Studio (χωρίς κώδικα)
Το Studio σου προσφέρει γραφικό τρόπο να ορίσεις προεπιλογές σε οποιοδήποτε πεδίο της φόρμας. Για να ορίσεις προεπιλογή με Studio:
- Άνοιξε το Studio στη φόρμα που θέλεις να αλλάξεις
- Κλίκαρε πάνω στο πεδίο που θέλεις να ρυθμίσεις
- Στην πλαϊνή παλέτα ιδιοτήτων εντόπισε το πεδίο Default Value
- Πληκτρολόγησε ή επίλεξε την τιμή που θέλεις ως αρχική
- Αποθήκευσε και βγες από το Studio
Το Studio αποθηκεύει αυτή τη ρύθμιση σαν εγγραφή ir.default στη βάση. Ισχύει σε επίπεδο εταιρείας εκτός αν ορίσεις περιορισμό για συγκεκριμένο χρήστη. Είναι ιδανικό για στατικές προεπιλογές σε Selection, Boolean, Char, Integer. Σε Many2one επιτρέπει επιλογή υπάρχουσας εγγραφής μέσω dropdown. Είναι ένας πρακτικός τρόπος να «δημιουργήσεις πεδία στο Odoo χωρίς να γράψεις κώδικα».
Σημείωσε: αν αλλάξεις την προεπιλογή μέσω Studio αφού έχουν δημιουργηθεί υπάρχουσες εγγραφές, οι υπάρχουσες εγγραφές δεν θα αλλάξουν. Η νέα προεπιλογή εφαρμόζεται μόνο σε εγγραφές που δημιουργούνται μετά την αλλαγή.
Χρήση Python σε τεχνική προσαρμογή
Σε τεχνικά σενάρια, ορίζεις defaults απευθείας στον ορισμό του πεδίου στο Python μοντέλο. Αυτό δίνει πλήρη έλεγχο για στατικές τιμές, lambdas και μεθόδους. Είναι η προτιμώμενη προσέγγιση όταν η προεπιλογή χρειάζεται πληροφορία runtime — π.χ. current user, σημερινή ημερομηνία, εταιρικές παραμέτρους.
Παράδειγμα που δείχνει διάφορους τύπους προεπιλογών σε custom module:
from odoo import fields, models
class SaleOrder(models.Model):
_inherit = 'sale.order'
# Στατική Boolean προεπιλογή
x_requires_review = fields.Boolean(
string='Απαιτεί Έλεγχο',
default=False,
)
# Στατική Selection προεπιλογή
x_delivery_preference = fields.Selection(
[('standard', 'Κανονική'), ('express', 'Εξπρές')],
string='Προτίμηση Παράδοσης',
default='standard',
)
# Δυναμική προεπιλογή μέσω μεθόδου
def _default_note(self):
return self.env['ir.config_parameter'].sudo().get_param(
'sale.default_note', default=''
)
x_internal_note = fields.Text(
string='Εσωτερική Σημείωση',
default=_default_note,
)
Αυτό το pattern ακολουθεί τα πρότυπα ανάπτυξης του Odoo και δουλεύει για όλους τους τύπους πεδίων. Οι μεθοδο-βασισμένες προεπιλογές είναι χρήσιμες όταν η λογική είναι πιο σύνθετη από ένα απλό lambda.
Δημιουργία/ενημέρωση εγγραφών ir.default προγραμματικά
Μπορείς να δημιουργήσεις ή να ενημερώσεις εγγραφές ir.default μέσω του XML-RPC API ή από αρχεία δεδομένων ενός module. Χρήσιμο όταν θέλεις να συμπεριλάβεις προεπιλογές ως μέρος της εγκατάστασης ενός προσαρμοσμένου module. Το μοντέλο ir.default δέχεται όνομα μοντέλου, όνομα πεδίου, τιμή και προαιρετικά company ή user για scope.
Αυτή η μέθοδος εμφανίζεται λιγότερο συχνά στην καθημερινή ανάπτυξη αλλά είναι χρήσιμη όταν παραδίδεις installable modules που πρέπει να ορίσουν sensible defaults κατά την εγκατάσταση.
Καλές πρακτικές για προεπιλεγμένες τιμές στο Odoo
Ορίστε προεπιλογές σε υποχρεωτικά πεδία
Αν ένα πεδίο είναι υποχρεωτικό, δώσε πάντα μια ρεαλιστική προεπιλογή όπου γίνεται. Αυτό μειώνει την τριβή και αποτρέπει σφάλματα κατά το αποθήκευμα όταν ο χρήστης ξεχνά ότι το πεδίο είναι required. Ο συνδυασμός required=True με πρακτική προεπιλογή είναι καλό μοτίβο.
Χρησιμοποίησε lambdas για ημερομηνίες
Μην σκληροκωδικοποιείς ημερομηνίες ως προεπιλογές. Χρησιμοποίησε lambda self: fields.Date.today() ώστε η προεπιλογή να είναι η τρέχουσα ημέρα τη στιγμή της δημιουργίας. Μια σκληρή ημερομηνία γερνάει αμέσως και γίνεται λάθος για κάθε μελλοντική εγγραφή.
Διατήρησε τη λογική προεπιλογών ελαφριά
Οι συναρτήσεις default τρέχουν κατά το άνοιγμα της νέας φόρμας, οπότε εκτελούνται συχνά. Απόφυγε βαριές ερωτήσεις στη βάση, κλήσεις εξωτερικών API ή μεγάλους υπολογισμούς μέσα σε default methods. Κράτα τις γρήγορες και απλές. Αν χρειάζεσαι πιο σύνθετες ενέργειες, σκέψου onchange ή compute πεδία που ενεργοποιούνται μετά την αρχική φόρμα.
Χρησιμοποίησε context defaults για ροές πλοήγησης
Κατά τη δημιουργία custom actions ή έξυπνων κουμπιών που ανοίγουν φόρμες, πέρασε default_field_name μέσω του action context αντί να βασίζεσαι σε στατικές προεπιλογές του μοντέλου. Αυτό είναι το pattern που χρησιμοποιεί και το ίδιο το Odoo και κρατάει τις προσαρμογές σου συμβατές με το framework.
Δοκίμασε προεπιλογές με πολλαπλούς χρήστες
Δυναμικές προεπιλογές που αναφέρονται σε self.env.user ή self.env.company συμπεριφέρονται διαφορετικά ανάλογα με τον χρήστη που είναι συνδεδεμένος. Δοκίμασε τουλάχιστον με δύο διαφορετικούς λογαριασμούς και, αν έχεις multi-company, με διαφορετικές εταιρείες. Κάτι που δουλεύει για admin μπορεί να δώσει απροσδόκητα αποτελέσματα σε standard χρήστη.
Συνηθισμένα λάθη και παγίδες
Μην χρησιμοποιείς μεταβλητά αντικείμενα ως προεπιλογές
Κλασικό λάθος Python: μην βάζεις default=[] ή default={}. Η λίστα ή το dict μοιράζεται μεταξύ όλων των εγγραφών και προκαλεί διαρροές δεδομένων. Χρησιμοποίησε lambda: default=lambda self: [], ώστε να δημιουργείται καινούριο αντικείμενο σε κάθε αρχικοποίηση.
Οι προεπιλογές δεν ενεργοποιούν onchange
Το να θέσεις προεπιλογή δεν πυροδοτεί onchange. Αν το πεδίο έχει onchange που κανονικά ενημερώνει άλλα πεδία, η προεπιλογή θα παρακάμψει αυτή τη σειρά. Οι χρήστες θα δουν την τιμή αλλά όχι τα παρακάτω αποτελέσματα του onchange. Αν χρειάζεσαι το onchange στην αρχικοποίηση, πρόσθεσέ το ρητά σε override του default_get ή χειρίσου τη λογική με άλλον τρόπο.
Σύγκρουση defaults μεταξύ ir.default και ορισμού μοντέλου
Αν έχεις ορίσει προεπιλογή και στον κώδικα Python και μέσω Studio/ir.default, η εγγραφή ir.default υπερισχύει της προεπιλογής του μοντέλου. Αυτό προκαλεί σύγχυση όταν debugging — ιδιαίτερα μετά από αλλαγή στο Studio που σιωπηλά αντικαθιστά κάτι που είχε βάλει ο developer στον κώδικα.
Η προεπιλογή δεν ισοδυναμεί με υποχρεωτικότητα
Πεδίο με προεπιλογή δεν σημαίνει αυτόματα ότι είναι required. Αν ο χρήστης το αφαιρέσει, θα σωθεί κενό. Μην βασίζεσαι μόνο στην προεπιλογή για την πληρότητα δεδομένων — αν χρειάζεται πάντα τιμή, συνδύασε με required=True.
Μην σκληροκωδικοποιείς IDs χρηστών/εταιρειών
Ένα default όπως default=1 που αναφέρεται σε ID είναι εύθραυστο — θα σπάσει σε περιβάλλοντα όπου τα IDs διαφέρουν. Χρησιμοποίησε δυναμικές αναφορές: lambda self: self.env.company.id ή lambda self: self.env.ref('module.xml_id').id.
Συμπέρασμα
Οι προεπιλογές είναι μικρό αλλά ισχυρό εργαλείο στο μοντέλο δεδομένων του Odoo. Μειώνουν την επανάληψη εισαγωγής, καθοδηγούν τους χρήστες σε συνεπείς επιλογές και κάνουν τις φόρμες πιο φιλικές. Είτε τις βάζεις γρήγορα με Studio είτε με κώδικα Python, το να κατανοήσεις τη λειτουργία τους βελτιώνει σημαντικά την υλοποίηση Odoo.
Τα βασικά που πρέπει να θυμάσαι: οι προεπιλογές τρέχουν μόνο κατά τη δημιουργία εγγραφής, δεν πυροδοτούν onchange, οι πηγές προεπιλογής υπακούουν σε σειρά προτεραιότητας, και τα μεταβαλλόμενα αντικείμενα πρέπει να δημιουργούνται μέσω lambda.
Μια σωστή ρύθμιση προεπιλογών είναι συχνά το στοιχείο που ξεχωρίζει μια φόρμα που «δένεται» φυσικά με τη δουλειά του χρήστη από μια άλλη που προκαλεί τριβή κάθε φορά που πρέπει να δημιουργηθεί νέα εγγραφή. Είναι μικρή επένδυση — μεγάλο όφελος καθημερινά.
Στη Dasolo βοηθάμε εταιρείες να υλοποιήσουν, να προσαρμόσουν και να βελτιστοποιήσουν το Odoo ώστε να ταιριάζει στις πραγματικές διαδικασίες τους. Αν χρειάζεσαι υποστήριξη για να ρυθμίσεις προεπιλογές, να δημιουργήσεις custom πεδία ή να σχεδιάσεις ένα λειτουργικό data model, μπορούμε να το αναλάβουμε. Επικοινώνησε μαζί μας και ας συζητήσουμε για την υλοποίηση Odoo της επιχείρησής σου.