Αν ασχολείστε με το Odoo —είτε γράφετε μοντέλα, είτε τροποποιείτε προβολές— το context θα εμφανιστεί συχνά. Δεν είναι απλώς μια ρύθμιση που βλέπεις μια φορά: συνοδεύει κλήσεις μεθόδων, φόρμες και ενέργειες, και λειτουργεί σχεδόν σαν αόρατος βοηθός που αλλάζει συμπεριφορές όπου χρειάζεται. Πολλοί προγραμματιστές το χρησιμοποιούν χωρίς να το καταλαβαίνουν βαθιά —μέχρι να προκύψει ένα πρόβλημα και τότε χρειάζεται να το εξηγήσουν.
Το να κατανοήσετε τι κάνει το context δεν είναι θεωρητική άσκηση. Επηρεάζει πρακτικά το πώς συμπληρώνονται αυτόματα πεδία, πώς φιλτράρονται εγγραφές, πότε επαναυπολογίζονται αποθηκευμένα computed πεδία, και γενικά πώς «συμπεριφέρεται» το μοντέλο δεδομένων σας. Σε απλές προσαρμογές Odoo ή σε ολοκληρωμένα modules, το σωστό context μειώνει δραστικά τον χρόνο debugging.
Αυτός ο οδηγός εξηγεί με σαφήνεια τι είναι το context, πώς διασχίζει το framework του Odoo και πώς να το χρησιμοποιείτε με ασφάλεια σε πραγματικά έργα.
Τι είναι το context στο Odoo
Στο Odoo, το context είναι απλώς ένα Python dictionary που ταξιδεύει μαζί με κάθε αίτημα, μέθοδο και χειρισμό εγγραφής. Δεν είναι τύπος πεδίου όπως τα υπόλοιπα — δεν θα δείτε fields.Context() στο ORM. Αντίθετα, το context είναι ένας μηχανισμός που μεταβάλλει τη συμπεριφορά πεδίων και ενεργειών.
Σκεφτείτε το σαν ένα σετ αόρατων οδηγιών που συνοδεύουν τα δεδομένα: πώς να προ-συμπληρωθεί ένα πεδίο, αν πρέπει να εμφανιστούν αρχειοθετημένες εγγραφές, σε ποια γλώσσα να γίνουν μεταφράσεις, ή ποιο domain να εφαρμοστεί στον επιλογέα συσχετιζόμενων εγγραφών.
Πού εμφανίζεται το context
Στο μοντέλο δεδομένων του Odoo το context συναντάται κυρίως σε τρεις θέσεις:
- Σε ορισμούς πεδίων στο Python: ως παράμετρος
contextσε σχεσιακά πεδία όπως Many2one, One2many και Many2many. - Σε XML attributes των προβολών: στο attribute
contextτων<field>tags σε φόρμες, λίστες και kanban views. - Στο περιβάλλον του ORM: προσπελάσιμο μέσω
self.env.contextστην Python και τροποποιήσιμο μεself.with_context(key=value).
Σε όλες αυτές τις περιπτώσεις, το context υπηρετεί την ίδια βασική ιδέα: μεταφέρει πρόσθετες πληροφορίες που διαμορφώνουν τη συμπεριφορά ενός πεδίου ή μιας εγγραφής κατά το runtime.
Πώς λειτουργεί το context μέσα στο μοντέλο δεδομένων του Odoo
Το context κυκλοφορεί μέσα στον κύκλο ζωής του αιτήματος —από το άνοιγμα μιας φόρμας μέχρι την αποθήκευση μιας εγγραφής— και ενεργοποιείται σε σημεία όπου το UI ή ο κώδικας χρειάζονται επιπλέον οδηγίες.
Προ-συμπλήρωση μέσω default_*
Μια από τις πιο συνηθισμένες χρήσεις είναι τα κλειδιά που αρχίζουν με default_. Όταν περνάτε στο context ένα κλειδί default_<όνομα_πεδίου>, το Odoo το χρησιμοποιεί για να προ-συμπληρώσει αυτό το πεδίο σε νέα εγγραφή.
Για παράδειγμα, αν ένα κουμπί ανοίγει μια φόρμα παραγγελίας και στο context βάζει {"default_partner_id": 42}, τότε το πεδίο πελάτη θα είναι ήδη συμπληρωμένο με τον partner ID 42 — χωρίς επιπλέον Python κώδικα.
Αυτό το μοτίβο χρησιμοποιείται εκτενώς στην ανάπτυξη Odoo για να φτιάχνετε ροές που οδηγούν τον χρήστη σωστά μεταξύ εγγραφών.
Το context στα σχεσιακά πεδία
Στον ορισμό ενός Many2one/One2many/Many2many στο Python μπορείτε να δώσετε παράμετρο context. Αυτό εφαρμόζεται όταν το πεδίο φορτώνει ή δημιουργεί εγγραφές μέσω του popup/προτάσεων.
Πρακτικό παράδειγμα: ένα Many2one προς res.partner με context={"default_is_company": True} σημαίνει πως αν ο χρήστης δημιουργήσει νέο partner από εκεί, το checkbox «Εταιρεία» θα είναι προ-επιλεγμένο —μια διακριτική βοήθεια χωρίς υποχρεωτικότητα.
Context μέσα σε XML προβολές
Στο XML των views, το attribute context σε ένα <field> λειτουργεί με τον ίδιο τρόπο αλλά μπορεί να είναι δυναμικό: μπορείτε να αναφερθείτε σε άλλες τιμές πεδίων με τη σύνταξη αξιολόγησης του Odoo.
Έτσι φτιάχνετε έξυπνες φόρμες όπου το context ενός πεδίου εξαρτάται από την τιμή κάποιου άλλου —μια συχνή τεχνική σε προσαρμογές Odoo που μειώνει την ανάγκη για επιπλέον Python κώδικα.
Ανάγνωση και αλλαγή του context στην Python
Μέσα σε οποιαδήποτε μέθοδο μοντέλου, το τρέχον context είναι διαθέσιμο ως self.env.context, το οποίο επιστρέφει όλο το λεξικό την ώρα της κλήσης.
Αν θέλετε να τρέξετε κώδικα με τροποποιημένο context, καλείτε self.with_context(key=value). Αυτή η κλήση επιστρέφει νέο recordset με το ενημερωμένο context, χωρίς να αλλάζει το αρχικό —μια καθαρή, μη καταστροφική προσέγγιση που ταιριάζει με το λειτουργικό στυλ του Odoo.
Συνηθισμένα ενσωματωμένα context κλειδιά
Το ίδιο το Odoo χρησιμοποιεί προεπιλεγμένα κάποια κλειδιά context που ενεργοποιούν συγκεκριμένη συμπεριφορά σε όλο το σύστημα:
lang: καθορίζει τη γλώσσα για μεταφρασμένα πεδία.active_test: βάλτεFalseγια να συμπεριλάβετε αρχειοθετημένες εγγραφές στην αναζήτηση.no_recompute: αποτρέπει τον επαναυπολογισμό αποθηκευμένων computed πεδίων.mail_notrack: απενεργοποιεί την καταγραφή αλλαγών στο chatter κατά το write.allowed_company_ids: ελέγχει ορατότητα σε multi-company περιβάλλον.bin_size: επιστρέφει μεγεθός αντί για το ίδιο το binary περιεχόμενο σε Binary πεδία.
Η γνώση αυτών των keys είναι μέρος οποιουδήποτε ολοκληρωμένου developer guide για Odoo, γιατί επιτρέπει να χειρίζεστε συμπεριφορές χωρίς να γράφετε custom κώδικα.
Πρακτικές επιχειρησιακές εφαρμογές
Το context δεν είναι εργαλείο μόνο για προγραμματιστές —λύει πραγματικά προβλήματα ροής εργασίας σε διαφορετικά επιχειρησιακά σενάρια. Ακολουθούν πέντε συνήθεις περιπτώσεις εφαρμογής.
1. CRM: Προ-συμπλήρωση Πωλητικής Ομάδας σε νέες ευκαιρίες
Αν μια υπεύθυνη πωλήσεων βλέπει kanban φιλτραρισμένο για την ομάδα της και πατήσει «Νέο», περιμένει η ευκαιρία να ανήκει στην ομάδα της. Παράγοντας default_team_id στο context του action, η φόρμα ανοίγει ήδη συμπληρωμένη —γίνεται λιγότερη χειροκίνητη διόρθωση.
2. Πωλήσεις: Προεπιλογή τιμοκαταλόγου ανά κατηγορία πελάτη
Όταν φτιάχνετε προσφορά από view ενός συγκεκριμένου customer segment, το context μπορεί να περάσει default_pricelist_id ανάλογα με την κατηγορία, καθοδηγώντας τον πωλητή χωρίς να κλειδώνει την επιλογή του.
3. Αποθήκη: Φιλτράρισμα τοποθεσιών σε φόρμες μεταφοράς
Σε λειτουργίες αποθήκης, το πεδίο «αποθήκη πηγής» μπορεί να περιοριστεί σε τοποθεσίες μιας συγκεκριμένης αποθήκης μέσω domain στο context του Many2one —καθαρό UI και λιγότερα λάθη σε multi-warehouse setups.
4. Λογιστική: Γραμμές τιμολογίου στη γλώσσα του πελάτη
Όταν εκδίδετε τιμολόγιο σε διεθνή πελάτη, το κλειδί lang στο context επιβάλλει τις μεταφράσεις στις περιγραφές. Έτσι ένα τιμολόγιο για πελάτη στη Γαλλία θα εμφανίζει περιγραφές στα γαλλικά, ακόμη κι αν το εσωτερικό σύστημα κρατά τα δεδομένα στα αγγλικά.
5. Προσαρμοσμένα μοντέλα: Εμφάνιση αρχειοθετημένων προϊόντων σε ειδική προβολή
Η ομάδα λειτουργιών μπορεί να χρειάζεται να βλέπει αποσυρμένα προϊόντα μαζί με τα ενεργά. Μια προσαρμοσμένη λίστα περνάει active_test: False στο action context και, χωρίς εκτεταμένο Python, η συγκεκριμένη προβολή δείχνει όλα τα προϊόντα ενώ το υπόλοιπο UI παραμένει αμετάβλητο.
Πώς να δημιουργήσετε και να προσαρμόσετε το context σε πεδία
Υπάρχουν δύο τρόποι να προσθέσετε ή να τροποποιήσετε context σε πεδία: χωρίς κώδικα μέσω Odoo Studio ή τεχνικά με Python και XML —ένα βασικό κεφάλαιο σε κάθε τεχνικό tutorial Odoo πάνω στη συμπεριφορά πεδίων.
Χρήση του Odoo Studio
Το Studio επιτρέπει αλλαγές πεδίων χωρίς κώδικα. Για σχεσιακά πεδία, δίνει επιλογή ρύθμισης context ώστε να ορίσετε προεπιλεγμένες τιμές που θα χρησιμοποιηθούν όταν δημιουργείται νέα εγγραφή από εκεί.
Είναι ιδανικό για απλές περιπτώσεις: προ-συμπλήρωση εταιρείας, ομάδας, κατηγορίας ή υπεύθυνου. Όμως η υποστήριξη context στο Studio είναι απλοποιημένη· για δυναμικό context που εξαρτάται από άλλες τιμές απαιτείται τεχνική παρέμβαση.
Όταν δουλεύετε με πεδία στο Odoo Studio, θυμηθείτε ότι το context αποθηκεύεται στη συγκεκριμένη view. Αν αργότερα κάνετε τεχνική επέκταση στην ίδια view, λάβετε υπόψη το context που έχει δημιουργήσει το Studio για να αποφύγετε συγκρούσεις.
Ορισμός context σε πεδία με Python
Σε custom module το context προστίθεται απευθείας στον ορισμό του πεδίου. Για Many2one, η παράμετρος context δέχεται ένα στατικό dictionary:
Αυτό το στατικό context εφαρμόζεται κάθε φορά που το πεδίο φορτώνει ή δημιουργεί σχετιζόμενες εγγραφές και δεν αλλάζει με βάση άλλες τιμές του τρέχοντος record. Αν χρειάζεστε context που αντιδρά στην κατάσταση της εγγραφής, μεταφέρετε τη λογική στο επίπεδο της view.
Ορισμός context σε XML προβολές
Στο XML των views, το attribute context δέχεται μια συμβολοσειρά που αξιολογείται runtime. Μπορείτε να αναφέρετε τιμές πεδίων, τον τρέχοντα χρήστη (uid), το ενεργό record ID (active_id) και άλλες μεταβλητές:
Αυτό καθιστά το context σε επίπεδο view πολύ πιο ευέλικτο από το πεδίου. Είναι ο συνηθισμένος τρόπος στο framework του Odoo για να φτιάχνετε φόρμες όπου η συμπεριφορά ενός πεδίου εξαρτάται από άλλο —έτσι δημιουργείτε διεπαφές που φαίνονται φυσικές στους χρήστες.
Πέρασμα context μέσω actions παραθύρου (Window Actions)
Μπορείτε επίσης να ορίσετε context σε εγγραφές ir.actions.act_window. Τα μενού και τα κουμπιά περνούν context στις προβολές που ανοίγουν: το πεδίο context της action συγχωνεύεται στο session context όταν φορτώνεται η view.
Αυτή είναι η συχνά καθαρότερη λύση για σενάρια όπως το παράδειγμα της CRM ομάδας: το context «ζει» στην action και όχι στο μοντέλο, επιτρέποντας διαφορετικές προεπιλογές σε διαφορετικά σημεία πλοήγησης χωρίς αλλαγές στον κώδικα του μοντέλου.
Καλές πρακτικές
Η εργασία με context γίνεται πιο προβλέψιμη αν ακολουθήσετε μερικούς σταθερούς κανόνες. Ισχύουν τόσο για modules όσο και για μικρές προσαρμογές Odoo.
- Χρησιμοποιήστε context για υποδείξεις, όχι για επιβολή. Τα defaults που περνάτε μέσω context πρέπει να καθοδηγούν τον χρήστη, όχι να τον μπλοκάρουν. Αν χρειάζεστε αυστηρό περιορισμό, χρησιμοποιήστε domain ή onchange/constraints.
- Τοποθετείστε δυναμικό context στις views, όχι στους ορισμούς πεδίων. Το context σε επίπεδο πεδίου είναι στατικό —αν πρέπει να αντικατοπτρίζει την τρέχουσα κατάσταση της εγγραφής, το XML της view είναι ο σωστός τόπος.
- Χρησιμοποιήστε
with_context()αντί να τροποποιείτε απευθείας τοenv.context. Το περιβάλλον του Odoo θεωρείται αμετάβλητο κατά τη διάρκεια μιας κλήσης —δημιουργήστε νέο περιβάλλον μεwith_context()για ασφαλείς αλλαγές. - Να είστε εκλεκτικοί με τα κλειδιά που περνάτε στο context. Τα κλειδιά συσσωρεύονται καθώς ταξιδεύουν στην κλήση, και περιττά keys μπορεί να προκαλέσουν παρενέργειες σε μεθόδους που τα ελέγχουν.
- Χρησιμοποιήστε context για να περάσετε flags σε conditional λογική. Ένα κοινό μοτίβο είναι ένα boolean flag όπως
from_wizard: Trueστο context, ώστε compute ή onchange να συμπεριφερθούν διαφορετικά χωρίς να γεμίσετε το μοντέλο με πεδία κατάστασης. - Τεκμηριώστε τα custom context keys στο module σας. Τα keys είναι «αόρατα» στο UI· προσθέστε σχόλια ή docstrings που εξηγούν τι κάνει το κάθε custom key. Αυτό σώζει χρόνο όταν εσείς ή συνάδελφοι επιστρέψετε στον κώδικα αργότερα.
Συνηθισμένα λάθη
Τα bugs που σχετίζονται με context είναι συχνά δύσκολα στο debugging επειδή οι επιπτώσεις δεν φαίνονται πάντα στο UI. Παρακάτω τα πιο συχνά λάθη που βλέπουμε στα έργα.
Λαθρες προσέγγισης: Θεωρώντας το default_* ως υποχρεωτική τιμή
Το default μέσω context εφαρμόζεται μόνο όταν μια εγγραφή δημιουργείται από φόρμα που περιέχει αυτό το context. Αν φτιάχνετε εγγραφές προγραμματικά χωρίς να περάσετε το context, το default δεν θα ισχύσει. Μερικοί προγραμματιστές συγχέουν αυτό με το Python-level default ενός πεδίου —δεν είναι το ίδιο. Όταν τα defaults έχουν σημασία, περάστε ρητά το context κατά το create.
Τροποποίηση του context dictionary απευθείας
Το ίδιο το λεξικό context διαμοιράζεται στην κλήση. Αν αλλάξετε self.env.context in-place, θα επηρεάσετε άλλες λειτουργίες στην ίδια συναλλαγή. Η ασφαλής πρακτική είναι self.with_context(new_key=value), που επιστρέφει νέο περιβάλλον με αντίγραφο του context και τις αλλαγές σας.
Περνώντας υπερβολικά πολλά κλειδιά στο context
Κάθε πρόσθετο κλειδί ακολουθεί όλη την αλυσίδα κλήσεων. Κάποιες μεθόδοι του Odoo ελέγχουν για συγκεκριμένα context keys και αντιδρούν –η προσθήκη άσχετων keys μπορεί να ενεργοποιήσει ανεπιθύμητες διαδρομές. Κρατήστε το context λιτό και στοχευμένο.
Ξεχασμένο active_test όταν αναζητάτε αρχειοθετημένα
Από προεπιλογή, οι search() και search_read() αποκλείουν τις αρχειοθετημένες εγγραφές (active = False). Αν χρειάζεστε αρχειοθετημένα, περάστε active_test: False στο context —η παράλειψη αυτού του βήματος προκαλεί συχνά προβλήματα σε προσαρμογές αποθέματος/προϊόντων.
Σύγκρουση context μεταξύ Studio και custom κώδικα
Αν το Studio έχει βάλει context σε ένα πεδίο και μετά προσθέσετε τεχνική επέκταση στην ίδια view, τα δύο context μπορεί να συγκρουστούν ή να επικαλύψουν το ένα το άλλο ανάλογα με τη σειρά συγχώνευσης XML. Πριν προσθέσετε context μέσω view inheritance, ελέγξτε τι έχει ήδη οριστεί για να αποφύγετε απρόβλεπτες συμπεριφορές —ένα κοινό ζήτημα όταν συνδυάζονται πεδία από Odoo Studio με module-based προσαρμογές.
Συμπεράσματα
Το context είναι ένας από τους μηχανισμούς του Odoo που κάνει «αόρατη» δουλειά. Μόλις κατανοήσετε πώς διαπερνά ορισμούς πεδίων, attributes προβολών και το ORM περιβάλλον, αποκτάτε λεπτομερή έλεγχο στη συμπεριφορά του μοντέλου σας.
Τα βασικά που πρέπει να θυμάστε: χρησιμοποιήστε κλειδιά default_* για να καθοδηγήσετε τον χρήστη χωρίς να τον δεσμεύσετε, βάλτε δυναμικό context στις views και όχι στα πεδία, προτιμήστε with_context() αντί για in-place αλλαγές, και κρατήστε το context μικρό και στοχευμένο ώστε να μην επηρεάζει κατά λάθος άλλα μέρη του συστήματος.
Είτε διαβάζετε ένα tutorial για πεδία Odoo, είτε χτίζετε custom module, είτε ψάχνετε γιατί ένα πεδίο συμπεριφέρεται παράξενα, η κατανόηση του context θα είναι πάντα κομμάτι της λύσης.
Στην Dasolo βοηθάμε επιχειρήσεις να υλοποιήσουν, να προσαρμόσουν και να βελτιστοποιήσουν το Odoo ώστε να ταιριάζει στις πραγματικές τους ροές εργασίας. Αν δουλεύετε πάνω σε προσαρμογή που χρησιμοποιεί context και δεν είστε σίγουροι ή θέλετε να συζητήσετε την υλοποίηση σας, μπορούμε να σας υποστηρίξουμε.
Επικοινωνήστε με την ομάδα μας μέσω της σελίδας επικοινωνίας και πείτε μας τι χτίζετε. Συνεργαζόμαστε με επιχειρήσεις κάθε μεγέθους για να φέρουμε το Odoo στην κατάσταση που πρέπει να είναι.