إهمال attrs في أودو: الانتقال إلى invisible وreadonly وrequired في أودو 16–19
تم إهمال قاموس attrs في أودو 16 وحذفه في أودو 17. يحدد هذا الدليل كل نمط attrs ومقابله من السمات المباشرة — مع كود قبل/بعد لحالات الاستخدام الأكثر شيوعًا. موثق لأودو 18 و19.
في أودو 15 وما سبقه، كانت السيطرة على ظهور حقل نموذج أو قراءته فقط أو إلزاميته بناءً على قيم حقول أخرى تستلزم قاموس `attrs` — سمة تشبه JSON تجمع شروطًا متعددة في مكان واحد. قدّم أودو 16 نهجًا أكثر نظافة: سمات `invisible` و`readonly` و`required` و`column_invisible` مباشرة تقبل تعبيرات تشبه Python. يغطي هذا الدليل ما الذي تغيّر ولماذا وكيفية ترحيل كل نمط شائع من `attrs`.
ما كانت سمة attrs؟
كانت `attrs` سمة XML مقبولة على عناصر الحقل والزر والمجموعة في عروض نماذج أودو والقوائم والبحث. كانت تأخذ قاموس Python (مكتوبًا كسلسلة JSON) يربط ثلاثة مفاتيح سلوك — `invisible` و`readonly` و`required` — بتعبيرات نطاق أودو تُقيَّم وفق قيم حقول السجل الحالي.
<!-- Odoo 15 and earlier — attrs syntax (DO NOT USE in Odoo 16+) -->
<field name="amount_total"
attrs="{
'invisible': [('state', '=', 'draft')],
'readonly': [('state', 'in', ['done', 'cancel'])],
'required': [('invoice_type', '=', 'out_invoice')]
}"/>جدول زمني للإهمال
| إصدار أودو | حالة attrs | الإجراء المطلوب |
|---|---|---|
| أودو 15 (وما سبقه) | مدعوم — الصيغة الأساسية | لا شيء. attrs هو النهج القياسي. |
| أودو 16 | مهمل — يُسجّل تحذير ترحيل. لا يزال يعمل. | ابدأ الترحيل: السمات المباشرة الجديدة تعمل بالتوازي. |
| أودو 17 | محذوف — يُثير خطأ تحليل عرض XML. | الترحيل إلزامي قبل الترقية إلى أودو 17. |
| أودو 18 و19 | محذوف — نفس خطأ أودو 17. | استخدم سمات invisible وreadonly وrequired وcolumn_invisible المباشرة فقط. |
الصيغة الجديدة — السمات المباشرة
من أودو 16 فصاعدًا، كل سلوك هو سمة XML منفصلة تقبل سلسلة تعبير Python. يُقيَّم التعبير في سياق السجل الحالي — جميع قيم الحقول في السجل متاحة كمتغيرات Python.
| السمة | تنطبق على | سياق التعبير | ملاحظات |
|---|---|---|---|
| invisible | field وbutton وgroup وdiv وpage وnotebook | قيم حقول السجل الحالي | يُخفي العنصر. لا يُرسل القيمة إلى الخادم عند الإخفاء. |
| readonly | field وgroup | قيم حقول السجل الحالي | يعرض الحقل غير قابل للتحرير. تُرسَل القيمة مع ذلك. |
| required | field | قيم حقول السجل الحالي | يُضيف التحقق من جهة العميل. يُوصى بالقيد من جهة الخادم أيضًا. |
| column_invisible | field داخل عرض tree/list | parent.field (استخدم بادئة parent. لحقول مستوى الرأس) | يُخفي العمود بالكامل. استخدمه بدلًا من invisible لأعمدة عرض القائمة. |
مرجع الترحيل — أنماط attrs إلى السمات الجديدة
| نمط attrs (أودو 15) | السمة المباشرة (أودو 16–19) | ملاحظات |
|---|---|---|
| attrs="{'invisible': [('state', '=', 'done')]}" | invisible="state == 'done'" | تحقق من التساوي البسيط |
| attrs="{'invisible': [('state', 'in', ['done', 'cancel'])]}" | invisible="state in ('done', 'cancel')" | عامل in — استخدم tuple وليس list |
| attrs="{'invisible': [('partner_id', '=', False)]}" | invisible="not partner_id" | التحقق من الفراغ لحقل Many2one |
| attrs="{'invisible': [('partner_id', '!=', False)]}" | invisible="partner_id" | التحقق من الوجود — اسم الحقل وحده كافٍ |
| attrs="{'readonly': [('state', 'in', ['done', 'cancel'])]}" | readonly="state in ('done', 'cancel')" | للقراءة فقط عند وجود قيمة ضمن مجموعة |
| attrs="{'required': [('invoice_type', '=', 'out_invoice')]}" | required="invoice_type == 'out_invoice'" | حقل إلزامي مشروط |
| attrs="{'invisible': [('type', '!=', 'product'), ('state', '!=', 'draft')]}" (منطق AND) | invisible="type != 'product' and state != 'draft'" | نطاق AND → Python and |
| attrs="{'invisible': ['|', ('type', '=', 'service'), ('state', '=', 'done')]}" (منطق OR) | invisible="type == 'service' or state == 'done'" | نطاق OR (البادئة '|') → Python or |
| إخفاء عمود عبر invisible في عرض الشجرة | column_invisible="parent.state == 'draft'" | استخدم column_invisible (وليس invisible) لأعمدة عرض القائمة; ارجع إلى سجل الرأس عبر parent. |
أمثلة على الكود قبل/بعد
مثال 1 — حقل عرض نموذج بسلوكيات متعددة
<!-- BEFORE — Odoo 15 (attrs, do not use in Odoo 16+) -->
<field name="amount_total"
attrs="{
'invisible': [('state', '=', 'draft')],
'readonly': [('state', 'in', ['done', 'cancel'])],
'required': [('invoice_type', '=', 'out_invoice')]
}"/>
<!-- AFTER — Odoo 16 / 17 / 18 / 19 -->
<field name="amount_total"
invisible="state == 'draft'"
readonly="state in ('done', 'cancel')"
required="invoice_type == 'out_invoice'"/>مثال 2 — رؤية عمود عرض القائمة
<!-- BEFORE — Odoo 15 (attrs in tree view) -->
<tree>
<field name="name"/>
<field name="amount" attrs="{'invisible': [('state', '=', 'draft')]}"/>
<field name="state"/>
</tree>
<!-- AFTER — Odoo 16+ (column_invisible for columns) -->
<list> <!-- tree was renamed to list in Odoo 16 -->
<field name="name"/>
<field name="amount" column_invisible="parent.state == 'draft'"/>
<field name="state"/>
</list>مثال 3 — منطق OR
<!-- BEFORE — Odoo 15 (OR domain with '|' prefix) -->
<field name="discount"
attrs="{'invisible': ['|', ('type', '=', 'service'), ('state', '=', 'done')]}"/>
<!-- AFTER — Odoo 16+ (Python or) -->
<field name="discount"
invisible="type == 'service' or state == 'done'"/>مثال 4 — رؤية الزر
<!-- BEFORE — Odoo 15 -->
<button name="action_confirm" string="Confirm"
attrs="{'invisible': [('state', '!=', 'draft')]}"/>
<!-- AFTER — Odoo 16+ -->
<button name="action_confirm" string="Confirm"
invisible="state != 'draft'"/>سمة states — مهملة أيضًا
بالإضافة إلى `attrs`، دعم أودو 15 أيضًا سمة `states` المختصرة التي تضبط الرؤية بناءً على حقل `state` في السجل. تم إهمالها في أودو 16 جنبًا إلى جنب مع `attrs`. استبدلها بـ `invisible` باستخدام نفس نمط التعبير.
<!-- BEFORE — Odoo 15 (states shorthand) -->
<button name="action_confirm" string="Confirm" states="draft"/>
<!-- AFTER — Odoo 16+ -->
<button name="action_confirm" string="Confirm"
invisible="state != 'draft'"/>البحث عن attrs في قاعدة الكود
ملاحظات الإصدار
| إصدار أودو | attrs | states | invisible / readonly / required | column_invisible | tree مقابل list |
|---|---|---|---|---|---|
| أودو 15 | ✓ مدعوم | ✓ مدعوم | غير متاح | غير متاح | tree فقط |
| أودو 16 | ⚠ مهمل (تحذير في السجلات) | ⚠ مهمل | ✓ مُدخَل | ✓ مُدخَل | list (الاسم المستعار tree يعمل) |
| أودو 17 | ✗ محذوف (خطأ تحليل XML) | ✗ محذوف | ✓ مطلوب | ✓ مطلوب للأعمدة | list (الاسم المستعار tree محتفظ به) |
| أودو 18 و19 | ✗ محذوف | ✗ محذوف | ✓ قياسي | ✓ قياسي | list (الاسم المستعار tree محتفظ به) |
هل تُرقّي وحداتك المخصصة في أودو إلى أودو 17 أو 18 أو 19؟
يتولى فريقنا المعتمد من أودو ترحيل الوحدات وإعادة هيكلة attrs إلى التعبيرات واختبار الترقية الكاملة للشركات السعودية — بما في ذلك التحقق من الامتثال لـ ZATCA وGOSI على الإصدار الجديد.
الأسئلة الشائعة
هل ستعمل وحدتي من أودو 15 التي تحتوي على attrs في أودو 16؟
ما الفرق بين invisible وcolumn_invisible؟
هل يمكنني استخدام دوال Python مثل len() أو isinstance() داخل تعبيرات invisible؟
كيف أجعل مجموعة أو علامة تبويب صفحة غير مرئية في عرض النموذج؟
قمت بالترقية إلى أودو 17 وجميع عروضي المخصصة تُظهر نموذجًا فارغًا. ما الذي حدث؟
هل تحتاج سمة domain على حقل علائقي إلى الترحيل أيضًا؟

iWesabe Editorial Team
رؤى عملية حول Odoo ERP وامتثال ZATCA والعمليات الرقمية للشركات السعودية — بقلم فرق الاستشارات والمالية والهندسة في iWesabe.
مقالات ذات صلة
كيفية إنشاء مقطع مخصص في موقع أودو
دليل خطوة بخطوة لبناء مكوّنات قابلة للسحب والإفلات في محرر موقع أودو — من قالب XML إلى لوحة المقاطع المباشرة. موثق لأودو 18 و19.
السياق والنطاق في أودو — مرجع المطوّر (أودو 16–19)
دليل عملي لنطاقات أودو (تصفية السجلات) والسياق (تمرير الحالة كأزواج مفتاح-قيمة) — كيف تعمل وأين تظهر وقواعد الصيغة من أودو 16 إلى أودو 19. موثق لأودو 18 و19.
كيفية إضافة الألوان إلى صفوف وخلايا عرض القائمة في أودو
استخدم سمات decoration-* لترميز الصفوف والخلايا بالألوان في عروض قائمة أودو بناءً على قيم الحقول — مع صيغة التعبيرات وجميع أنواع الزخرفة وملاحظة الترحيل لإعادة التسمية من tree إلى list. موثق لأودو 18 و19.