تخطي للذهاب إلى المحتوى

دليل شامل لحقل Selection في Odoo

دليل شامل لحقل الاختيار في نموذج بيانات Odoo: من الأساسيات إلى تخصيصات المطورين
6 مارس 2026 بواسطة
دليل شامل لحقل Selection في Odoo
Dasolo
لا توجد تعليقات بعد

مقدمة


كل مرة يختار فيها مستخدم أولوية لفرصة، أو طريق دفع، أو يعلّم منتجًا بأنه نشط أو مؤرشف في أودو، غالبًا ما يتعامل مع حقل اختيار. هذا الحقل من أبسط أدوات النمذجة ولكنه يؤثر مباشرة على جودة البيانات وسهولة تقارير النظام، لذا من الضروري فهمه جيدًا عند تصميم التطبيقات في أودو.


على عكس حقل النص الحر حيث يمكن لأي شخص كتابة أي شيء، يقيد حقل الاختيار الإدخال إلى مجموعة خيارات محددة سلفًا. هذه القيدية ضرورية للحفاظ على تناسق السجلات، وتسهيل الفلترة والتجميع، ومنع الأخطاء البشرية مثل الأخطاء الإملائية التي تبعثر النتائج وتفسد لوحات المراقبة بمرور الوقت.


هذا الدليل يشرح ما يخزنه الحقل وكيف يظهر للمستخدم، ويعرض طرق إضافته وتعديله سواء عبر Odoo Studio أو عبر كود بايثون أو عبر واجهات برمجة خارجية. ستجد أمثلة عملية من سير العمل الفعلية وقائمة بالأخطاء المتكررة وكيفية تجنّبها.

ما هو حقل الاختيار في أودو


في طبقة ORM بأودو، يخزّن حقل الاختيار قيمة نصية من مجموعة ثابتة من الخيارات. كل خيار يُعرّف كمفتاح وقيمة: المفتاح هو ما يُحفظ في قاعدة البيانات، والعبارة الواضحة هي ما يراه المستخدم في الشاشة.


كمثال عملي على فكرة المفاتيح والملصقات:

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

في المثال أعلاه تُحفظ المفاتيح '0'، '1'، '2'، '3' في قاعدة البيانات، بينما تظهر للمستخدم التسميات Normal، Low، High، Very High. هذا الانفصال مهم لأنه يسمح لك بتغيير النصوص الظاهرة دون المساس بالبيانات المخزنة خلفها.


في واجهة المستخدم يظهر حقل الاختيار عادة كقائمة منسدلة في عرض النموذج، وفي قوائم السجلات يعرض التسمية المقروءة. عند استخدام واجهة badge يتحول كل خيار إلى وسم ملون يسهل تمييز الحالة بسرعة في الشاشات المزدحمة.


في Odoo Studio يُسمى هذا النوع Selection، والحقل الذي تُنشئه ستراه باسم تقني يبدأ بـx_studio_. عند إنشائه عبر الكود أو API تختار أنت الاسم الفني للحقول.

كيف يعمل الحقل


على مستوى قاعدة البيانات في أودو تُخزّن حقول الاختيار في PostgreSQL كعمود VARCHAR. قاعدة البيانات تحفظ المفتاح فقط، وليس التسمية. لذلك عند كتابة عوامل التصفية أو إجراءات الخادم يجب أن تعتمد على المفتاح، لا على النص الظاهر للمستخدم.


مثلاً، للبحث عن كل الفرص ذات الأولوية العالية عليك استخدام المجال [('priority', '=', '2')] وليس [('priority', '=', 'High')].

السمات الرئيسية للحقل

إليك الخصائص الأكثر أهمية لحقل الاختيار في إطار عمل أودو:

  • selection: قائمة الأزواج (key, label) التي تحدد الخيارات المتاحة. يمكن أيضًا أن تكون اسم دالة (سلسلة) تعيد القائمة بصورة ديناميكية.
  • default: المفتاح المستخدم افتراضيًا عندما لا يكون هناك قيمة محددة بعد. إذا لم تحدد، يبقى الحقل فارغًا.
  • required: يجبر المستخدم على اختيار قيمة قبل الحفظ. عند الجمع بين هذا والافتراضي تحصل على نمط شائع لحالة الحالة أو الحالة الافتراضية.
  • selection_add: يُستخدم عند توريث النماذج لإضافة خيارات لحقل موجود دون إعادة تعريف كامل القائمة — وهو الأسلوب السليم عند تمديد حقل أصلي.
  • ondelete: يستخدم مع selection_add لتحديد مصير السجلات التي تستخدم خيارًا تمت إزالته عند إلغاء تثبيت الوحدة التي أضافته.

قوائم ثابتة مقابل ديناميكية

بشكل افتراضي تُعرّف الخيارات ثابتة داخل تعريف الحقل. لكن يمكنك تمرير اسم دالة إلى معامل selection، فتستدعي أودو تلك الدالة وقت التشغيل لبناء القائمة وفق سياق المستخدم أو الشركة أو أي عامل آخر.


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')]

كيف يظهر الحقل في العروض

في عرض النموذج يظهر الحقل كقائمة منسدلة اعتيادية. يمكنك إضافة widget="badge" لعرضه كعلامة ملونة، أو widget="radio" لعرض الخيارات كأزرار راديو أفقية عندما تكون الخيارات قليلة وتريد رؤيتها كلها دفعة واحدة.


التعامل مع ORM في أودو

قراءة وكتابة حقول الاختيار في ORM تتم بسهولة: تضع المفتاح مباشرة، وأودو يتولى ربطه بالتسمية للعرض. عند استرجاع تعريف الحقل عبر XML-RPC مع fields_get سيتضمن الحقل قائمة [key, label] الكاملة لتستخدمها في أي واجهة خارجية تبنيها.


حالات استخدام تجارية


انتشار الحقل في وحدات أودو


حقل الاختيار يظهر في معظم الوحدات القياسية في أودو. فيما يلي خمسة أمثلة عملية من سير العمل التجاري الشائع.

CRM: أولوية الفرصة ومراحل القمع


حقل الأولوية في CRM مثال نموذجي: عدة مستويات تساعد فريق المبيعات على ترتيب الأولويات. ينعكس هذا الحقل مباشرة في ألوان عرض كانبان، ويمكن استخدامه في إجراءات مؤتمتة لإرسال تذكيرات أو مهام متابعة عند تصعيد فرصة. تحسين توزيع الأولويات عادةً ما يكون من أول خطوات تحسين جودة البيانات بعد إطلاق النظام.

المبيعات: شروط الدفع وسياسة الفوترة


حقل invoice_policy على المنتج يحدد ما إذا كانت الفاتورة تُنشأ بناءً على الكميات المطلوبة أم المسلمة؛ هذا القرار يؤثر على سير كامل عملية الفوترة. بنفس الأسلوب تُستخدم حقول الاختيار لتحديد نمط تحصيل الاشتراكات (مدفوع مسبقًا أو لاحقًا)، وهي أمثلة تبين كيف يمكن لحقل الاختيار أن يغير منطق العمل وليس فقط وسم السجل.

المخزون: حالات جودة المنتج والدفعات


في التصنيع وضمان الجودة تُستخدم حقول الاختيار لتتبع حالة الدفعات، أرقام السلاسل، وأوامر الصيانة؛ مثلاً حالة أمر الصيانة تنتقل بين مسودّة، مؤكّدة، قيد الإصلاح، جاهز، ومكتمل — وكل انتقال قد يطلق بريدًا آليًا أو حركة مخزون أو قيدًا محاسبيًا. حقل الاختيار هنا هو نقطة التحكم الأساسية في سير العمل.

المحاسبة: طريقة الدفع ونوع الدفتر


حقل نوع الدفتر في المحاسبة يفرّق بين دفاتر مبيعات، مشتريات، نقدية وبنكية. أودو يعتمد هذا الحقل لتطبيق منطق القيد المناسب، ولتقييد الحسابات المتاحة، ولمنع عمليات غير مطابقة لنوع الدفتر. هذا مثال على حقل يتحكم في قواعد عمل لا يقتصر دورها على عرض قيّم.

الموارد البشرية: نوع التوظيف وحالة العقد

إنشاء أو تخصيص حقل الاختيار


فرق الموارد البشرية تستخدم حقول الاختيار لتتبع نوع التوظيف وحالة العقود وطلبات الإجازة. حالة العقد تتحرك من جديد إلى مفتوح ثم منتهي أو ملغى؛ ويمكن إعداد تنبيهات قبل انتهاء العقد أو قوائم مهام للتوظيف عند بداية الموظف. حقل الاختيار يمثّل الحالة التي تبنى عليها كل هذه الأتمتة.


طرق إضافة الحقل

ثلاثة مسارات رئيسية لإضافة حقل اختيار إلى نموذج أودو، حسب حاجتك لإدارة التغيير عبر نظام التحكم في النسخ أو رغبتك بالتعديل بدون كود.

  1. باستخدام Odoo Studio (بدون كود)
  2. Odoo Studio أداة منخفضة الكود تتيح إضافة حقول دون كتابة بايثون. خطوات سريعة لإضافة حقل اختيار عبر الستوديو:
  3. افتح Odoo Studio من القائمة الرئيسية.
  4. انتقل إلى النموذج الذي تريد إضافة الحقل عليه.
  5. اسحب حقل Selection من الشريط الجانبي إلى المكان المناسب في النموذج.
  6. أدخل الخيارات في لوحة خصائص الحقل، وأضف تسمية لكل خيار.

اختياريًا عيّن قيمة افتراضية وحدد ما إذا كان الحقل مطلوبًا.


احفظ واغلق الستوديو.

ستودي يولّد مفاتيح تلقائيًا ويعطى الحقل بادئة x_studio_ ويضيفه إلى العرض. هذه أسرع طريقة لتطبيق تغييرات أثناء جلسة تحليل مع العميل.

باستخدام بايثون في وحدة مخصصة

للمطورين، تعرف حقول الاختيار داخل ملفات النماذج في بايثون — وهي الطريقة المفضلة للتخصيصات التي تحتاج إلى التحكم في النسخ والنشر عبر بيئات متعددة:


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')

بعد تعريف الحقل تُضيفه إلى ملف العرض XML ليظهر في الواجهة، وتقوم أودو بإنشاء عمود قاعدة البيانات عند تثبيت أو ترقية الوحدة.

لإضافة خيارات لحقل أصلي استخدم selection_add بدلاً من إعادة تعريفه بالكامل:

class SaleOrder(models.Model): _inherit = 'sale.order' state = fields.Selection( selection_add=[('custom_approval', 'Pending Approval')], ondelete={'custom_approval': 'set default'} )

باستخدام XML-RPC API

إذا كنت تدير التهيئات برمجياً كجزء من خط نشر أو سكربت تكوين بعيد، يمكنك إنشاء حقول اختيار عبر 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', }] )

عند الإنشاء عبر API يجب تمرير قيمة selection كسلسلة تمثّل القائمة. وتعيين state: manual يخبر أودو أن الحقل أنشأ يدويًا، وهو الإعداد المناسب للحقول المصنوعة عبر الستوديو أو API. تُستخدم هذه الطريقة في سيناريوهات التشغيل الآلي للتهيئة.


قواعد ذهبية للأفضل ممارسات

1. استخدم مفاتيح معبرة وثابتة


المفتاح هو ما يحفظ ويُستخدم في الفلاتر والإجراءات الآلية. اختر مفتاحًا يصف الخيار بوضوح ولن تضطر لتغييره لاحقًا. سلاسل قصيرة بالحروف الصغيرة تعمل جيدًا: 'draft'، 'confirmed'، 'cancelled'. تجنّب المفاتيح الرقمية إلا إذا كان للترتيب معنى واضح، لأن الأرقام تصعب قراءة المنطق البرمجي لاحقًا.

2. اجعل القائمة قصيرة وكاملة


إذا تجاوزت الخيارات ثمانية إلى عشرة فقد يكون الحقل يؤدي دورًا أكبر مما ينبغي. فكر إن كان ربط Many2one إلى نموذج إعدادات أسهل — هذه الطريقة تمكّن المستخدمين من إدارة الخيارات بأنفسهم دون تدخل مطور.

3. عيّن قيمة افتراضية للحقول المطلوبة


عند جعل الحقل مطلوبًا عيّن قيمة افتراضية منطقية لتفادي أخطاء التحقق عند إنشاء السجلات برمجياً أو عبر الاستيراد، حيث المستخدم قد لا يحدد القيمة يدوياً.

4. استخدم selection_add عند تمديد حقول أصلية


المشكلات الشائعة


عند إضافة خيارات لحقل أودو موجود استخدم selection_add لسلامة التوافق مع وحدات أخرى، ورافقها دائمًا بمعامل ondelete لشرح ماذا يحدث عند إلغاء تثبيت الوحدة.

5. استخدم ويدجيت badge لزيادة الوضوح


في قوائم العرض وكانبان استبدال النص بعلامة ملونة عبر widget="badge" يسهل المسح البصري للحالات ويجعل الحقول ذات الأهمية تظهر فورًا.

مشكلات يمكن أن تكلفك وقتًا ثمينًا


تغيير المفتاح يكسر البيانات

يمكنك تعديل تسمية الخيار بأمان لأن التسمية ليست مخزنة. لكن تغيير المفتاح بعد وجود سجلات به يؤدي إلى إفساد القيم الموجودة: السجلات ستعرض قيمة مفقودة وأي فلاتر أو مهام مؤتمتة ستتوقف. إذا كان لابد من تغيير مفتاح يجب أولًا تنفيذ عملية ترحيل بيانات لتحديث كل السجلات المتأثرة.


إزالة خيار تترك سجلات يتيمة

حذف خيار بينما هناك سجلات تستخدمه يؤدي إلى قيم مفقودة في الواجهة. قبل إزالة خيار ابحث عن السجلات المرتبطة وقم بتحديثها إلى قيمة صحيحة أو أرشفتها — هذه مشكلة شائعة أثناء مشاريع تنظيف البيانات.


استخدام التسمية بدلاً من المفتاح في الفلاتر

خطأ شائع هو أن يكتب مستخدم أقل تقنية فلترًا بالتسمية الظاهرة بدلًا من المفتاح. هذا ينتج فلترًا لا يعيد نتائج بدون إظهار خطأ، مما يصعّب تشخيص السبب. تأكد دائمًا من المفتاح المستخدم قبل بناء أي قاعدة فلترة.

الخلاصة


استخدام Selection بدلًا من Many2one عندما تتغير الخيارات كثيرًا


إذا تغيّرت القائمة كثيرًا أو يحتاج المستخدمون لإدارتها بأنفسهم، أو إذا كانت الخيارات تحمل خصائص إضافية (لون، ترتيب، حساب مرتبط)، فربط Many2one إلى نموذج إعدادات سيكون أسهل وأقل تكلفة صيانة على المدى الطويل.

عدم التعامل مع القيمة الفارغة في منطق الخادم

حقل اختيار غير مطلوب قد يحتفظ بقيمة False عند عدم تحديد خيار. إذا قارنت الحقل بسلسلة دون التحقق من وجود قيمة، ستحصل على سلوك غير متوقع أو أخطاء. تعامل دائمًا مع حالة الفراغ في الحسابات المحسوبة والإجراءات الخادمية. الخلاصة العملية حقل الاختيار يبدو بسيطًا لكنه أداة قوية لتنظيم سير العمل في أودو. فهم الفرق بين المفتاح والتسمية، ومتى تستخدم selection_add، ومتى تختار Many2one، كلها قرارات وظيفية تؤثر على سهولة صيانة النظام وجودة البيانات بعد إطلاقه.

دليل شامل لحقل Selection في Odoo
Dasolo 6 مارس 2026
شارك هذا المنشور
تسجيل الدخول حتى تترك تعليقاً