اذهب إلى المحتوى

تطبيق عملي لتعلم جانغو - الجزء الثالث: موقع مدير جانغو Django Admin


Ola Abbas

أنشأنا نماذجًا لموقع المكتبة المحلية LocalLibrary، وسنستخدم الآن موقع مدير جانغو Django Admin لإضافة بعض بيانات الكتب الحقيقية. سنوضّح أولًا كيفية تسجيل النماذج في موقع المدير، ثم سنوضّح كيفية تسجيل الدخول وإنشاء بعض البيانات، وسنعرض في نهاية المقال بعض الطرق التي يمكنك من خلالها تحسين عرض موقع المدير.

  • المتطلبات الأساسية: أكمل أولًا مقال استخدام النماذج Models.

  • الهدف: فهم فوائد وقيود موقع مدير جانغو واستخدامه لإنشاء بعض السجلات للنماذج.

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

أُجرِي كل الإعداد المطلوب لتضمين تطبيق المدير في موقع الويب تلقائيًا عندما أنشأتَ المشروع الهيكلي (اطلع على توثيق جانغو للحصول على معلومات حول الاعتماديات Dependencies الفعلية المطلوبة)، فكل ما يجب عليك فعله لإضافة نماذجك إلى تطبيق المدير هو تسجيلها فقط. سنقدم في نهاية هذا المقال عرضًا موجزًا لكيفية إعداد منطقة المدير لعرض بيانات نموذجنا بصورة أفضل.

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

تتألف هذه السلسلة الفرعية من السلسلة الأشمل تعلم تطوير الويب من المقالات التالية:

تسجيل النماذج

أولًا، افتح الملف admin.py في التطبيق catalog ضمن ‎/locallibrary/catalog/admin.py، إذ يبدو هذا الملف حاليًا كما يلي:

from django.contrib import admin

# سجّل نماذجك هنا

لاحظ أنه يستورد django.contrib.admin. سجّل النماذج من خلال نسخ النص التالي في نهاية الملف، إذ تستورد هذه الشيفرة البرمجية النماذج وتستدعي admin.site.register لتسجيل كلٍّ منها:

from .models import Author, Genre, Book, BookInstance

admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Genre)
admin.site.register(BookInstance)

ملاحظة: إذا قبلت التحدي لإنشاء نموذج يمثل اللغة الطبيعية للكتاب في المقال السابق، فاستورد ذلك النموذج وسجّله.

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

إنشاء مستخدم مسؤول Superuser

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

استدعِ الأمر التالي في مجلد الملف manage.py لإنشاء المستخدم المميز، إذ سيُطلَب منك إدخال اسم مستخدم وعنوان بريد إلكتروني وكلمة مرور قوية:

python3 manage.py createsuperuser

سيُضاف مستخدم مميز جديد إلى قاعدة البيانات بعد اكتمال الأمر السابق. أعِد تشغيل خادم التطوير لتتمكن من اختبار تسجيل الدخول كما يلي:

python3 manage.py runserver

تسجيل الدخول واستخدام الموقع

يمكنك تسجيل الدخول إلى الموقع من خلال فتح عنوان URL للمدير "‎/admin"، مثل "http://127.0.0.1:8000/admin" وإدخال بيانات اعتماد المستخدم المميز وكلمة المرور الجديدة، إذ سيُعاد توجيهك إلى صفحة تسجيل الدخول ثم ستعود إلى عنوان URL للمدير "‎/admin" بعد إدخال تفاصيلك.

يعرض هذا الجزء من الموقع جميع نماذجنا مُجمَّعةً حسب التطبيق المُثبَّت. يمكنك النقر على اسم النموذج للانتقال إلى شاشة تعرض قائمةً بجميع السجلات المرتبطة به، ثم النقر على هذه السجلات لتعديلها. يمكنك النقر مباشرةً على رابط الإضافة Add بجانب كل نموذج لإنشاء سجل من هذا النوع.

01_admin_home.png

انقر على رابط الإضافة Add الموجود على يمين النموذج Books لإنشاء كتاب جديد، إذ سيظهر مربع حوار يشبه إلى حد كبير الشكل الآتي. لاحظ كيف تتطابق عناوين كل حقل ونوع عنصر الواجهة المُستخدَم ونص التعليمات help_text -إن وجد- مع القيم التي حدّدتها في النموذج.

أدخِل قيم الحقول، ويمكنك إنشاء مؤلفين Authors أو أنواع Genres جديدة بالضغط على الزر + بجانب الحقول أو تحديد قيم الموجودة من القوائم إذا أنشأتها مسبقًا. يمكنك عند الانتهاء الضغط على زر حفظ SAVE أو حفظ وإضافة آخر Save and add another أو حفظ ومتابعة التعديل Save and continue editing لحفظ السجل.

02_admin_book_add.png

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

انقر على رابط الصفحة الرئيسية Home link في الأعلى للرجوع إلى صفحة المدير الرئيسية عند الانتهاء من إضافة الكتب، ثم انقر على رابط الكتب Books لعرض قائمة الكتب الحالية، أو انقر على أحد الروابط الأخرى لمشاهدة قوائم النماذج الأخرى. يمكن أن تبدو القائمة الآن مشابهة للقطة الشاشة التالية بعد أن أضفت بعض الكتب، إذ سيُعرَض عنوان كل كتاب، وهي القيمة المُعادة في التابع ‎__str__()‎ الخاص بالنموذج Book الذي حدّدناه في المقال السابق.

03_admin_book_list.png

يمكنك حذف الكتب من هذه القائمة من خلال تحديد مربع الاختيار بجانب الكتاب الذي لا تريده وتحديد إجراء الحذف delete…‎ من القائمة المنسدلة Action، ثم الضغط على الزر Go. يمكنك إضافة كتب جديدة بالضغط على زر إضافة كتاب ADD BOOK.

يمكنك تعديل كتاب من خلال اختيار اسمه في الارتباط، فصفحة تعديل الكتاب الموضَّحة في الشكل الآتي مطابقة تقريبًا لصفحة الإضافة، ولكن الاختلافات الرئيسية بينهما هي عنوان الصفحة "Change book" وإضافة الأزرار حذف Delete والسجل HISTORY وعرض على الموقع VIEW ON SITE، إذ يظهر هذا الزر الأخير لأننا عرّفنا التابع get_absolute_url()‎ في نموذجنا.

ملاحظة: يؤدي النقر فوق الزر VIEW ON SITE إلى ظهور استثناء NoReverseMatch بسبب محاولة التابع get_absolute_url()‎ لعكس ()reverse رابط عنوان URL المُسمى ('book-detail') غير المُعرّف بعد. سنعرّف ربط العنوان URL والعرض المرتبط به في المقال السابع من هذه السلسلة.

04_admin_book_modify.png

انتقل الآن مرةً أخرى إلى الصفحة الرئيسية Home باستخدام رابط Home في مسار التنقل ثم اعرض قوائم المؤلف Author والنوع Genre، إذ يجب أن يكون لديك عدد منها مُنشَأ مسبقًا عند إضافة الكتب الجديدة، ولكن لا تتردد في إضافة المزيد منها.

لن يكون لديك أيّ نسخ كتب Book Instances، لأنها لم تُنشَأ من الكتب Books، بالرغم من أنه يمكنك إنشاء كتاب Book من BookInstance، فهذه هي طبيعة الحقل من النوع ForeignKey. انتقل مرةً أخرى إلى الصفحة الرئيسية واضغط على زر الإضافة Add المرتبط بعرض شاشة إضافة نسخة كتاب Add book instance التالية. لاحظ المعرّف الكبير والفريد بصورة عامة، والذي يمكن استخدامه لتحديد نسخة من كتاب في المكتبة بصورة منفصلة.

05_admin_bookinstance_add.png

أنشئ عددًا من هذه السجلات لكل كتاب من كتبك، واضبط الحالة على أنها متوفرة Available لبعض السجلات على الأقل وأنها مُعارة On Loan لسجلات أخرى. إذا كانت الحالة غير متوفرة، فاضبط أيضًا تاريخ استرجاع الكتاب Due back مستقبلًا.

لقد تعلمت كيفية إعداد واستخدام موقع المدير، وأنشأت سجلات للنماذج Book و BookInstance و Genre و Author التي سنتمكن من استخدامها بمجرد إنشاء العروض والقوالب.

الضبط المتقدم

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

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

يمكنك تخصيص الواجهة لتسهيل استخدامها، فبعض الأشياء التي يمكنك تطبيقها هي:

  • عروض القائمة List Views:

    • أضف الحقول أو المعلومات الإضافية المعروضة لكل سجل.
    • أضف مرشّحات لتحديد السجلات المُدرجَة بناءً على التاريخ أو بعض قيم التحديد الأخرى، مثل حالة إعارة الكتاب.
    • أضف خيارات إضافية إلى قائمة الإجراءات في عروض القائمة واختر مكان عرض هذه القائمة في الاستمارة.
  • العروض التفصيلية Detail Views:

    • اختر الحقول المراد عرضها (أو استبعادها) مع ترتيبها وتجميعها وما إذا كانت قابلة للتعديل وعنصر الواجهة المُستخدَم والاتجاه وغير ذلك.
    • أضف الحقول المرتبطة بسجلٍ ما للسماح بالتعديل المُضمَّن مثل إضافة القدرة على إضافة وتعديل سجلات الكتاب أثناء إنشاء سجل المؤلف الخاص بها.

سنلقي في هذا القسم نظرةً على بعض التغييرات التي من شأنها تحسين واجهة موقع مكتبتنا المحلية LocalLibrary، مثل إضافة المزيد من المعلومات إلى قوائم النموذج Book و Author، وتحسين تخطيط عروض التعديل الخاصة بها. لن نغير عرض النموذجين Language و Genre، إذ يحتوي كلٌ منهما على حقل واحد فقط، لذلك لا توجد فائدة حقيقية من ذلك.

يمكنك العثور على مرجع كامل لجميع خيارات تخصيص موقع المدير في توثيق جانغو، ويمكنك على الاطلاع على مقال تنشيط واجهة مدير جانغو والاتصال بها لمعلومات أكثر.

تسجيل الصنف ModelAdmin

يمكنك تغيير كيفية عرض النموذج في واجهة المدير من خلال تعريف الصنف ModelAdmin (الذي يصف التخطيط) وتسجيله مع النموذج.

لنبدأ بالنموذج Author. افتح الملف admin.py في التطبيق catalog ضمن ‎/locallibrary/catalog/admin.py. ضع تعليقًا على التسجيل الأصلي (ابدأه بالرمز #) للنموذج Author كما يلي:

# admin.site.register(Author)

أضف صنف AuthorAdmin جديد وسجّله كما يلي:

# تعريف صنف المدير
class AuthorAdmin(admin.ModelAdmin):
    pass

# تسجيل صنف المدير في النموذج المرتبط به
admin.site.register(Author, AuthorAdmin)

سنضيف الآن أصناف ModelAdmin للنموذجين Book و BookInstance. يجب التعليق على التسجيلات الأصلية مرةً أخرى كما يلي:

# admin.site.register(Book)
# admin.site.register(BookInstance)

يمكننا الآن إنشاء وتسجيل النماذج الجديدة من خلال استخدام المزخرف ‎@register لتسجيل النماذج، والذي يفعل الشيء نفسه تمامًا الذي تفعله صيغة admin.site.register()‎:

# ‫تسجيل أصناف المدير للنموذج Book باستخدام المزخرف
@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    pass

#  BookInstance  تسجيل أصناف المدير للنموذج باستخدام المزخرف 
@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    pass

جميع أصناف المدير فارغة حاليًا (لاحظ pass)، لذلك لن يتغير سلوك المدير، ويمكننا توسيعها لتحديد سلوك المدير الخاص بالنموذج.

ضبط عروض القائمة

تسرد المكتبة المحلية LocalLibrary حاليًا جميع المؤلفين الذين يستخدمون اسم الكائن الذي ينشئه التابع ‎__str__()‎ الخاص بالنموذج، وهذا جيد عندما يكون لديك عدد قليل من المؤلفين، ولكن يمكن أن ينتهي بك الأمر بالحصول على نسخ مكررة بمجرد أن يكون لديك العديد من المؤلفين. يمكنك التمييز بينها أو إظهار مزيد من المعلومات حول كل مؤلف من خلال استخدام السمة list_display لإضافة حقول إضافية إلى العرض.

ضع الشيفرة البرمجية الآتية بدلًا من الصنف AuthorAdmin. يُصرَّح عن أسماء الحقول المعروضة في القائمة ضمن صف tuple بالترتيب المطلوب كما يلي (هذه هي الأسماء نفسها المُحدَّدة في نموذجك الأصلي):

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')

انتقل إلى قائمة المؤلفين في موقع الويب، إذ يجب الآن عرض الحقول السابقة على النحو التالي:

06_admin_improved_author_list.png

سنعرض أيضًا حقول المؤلف author والنوع genre للنموذج Book، فالحقل author هو حقل من النوع ForeignKey للعلاقة (واحد إلى متعدد)، وبالتالي ستمثله قيمة التابع ‎__str__()‎ للسجل المرتبط به. ضع ما يلي بدلًا من الصنف BookAdmin:

class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')

لسوء الحظ، لا يمكننا تحديد الحقل genre مباشرةً في السمة list_display، لأنه حقل من النوع ManyToManyField، إذ يمنع جانغو هذا النوع من الحقول لأنه سيكون هناك تكلفة كبيرة للوصول إلى قاعدة البيانات عند تطبيقه. لذا سنعرّف الدالة display_genre للحصول على المعلومات بوصفها سلسلة نصية، وهي الدالة التي استدعيناها سابقًا وسنعرّفها لاحقًا.

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

أضف الشيفرة البرمجية الآتية إلى النموذج Book في الملف models.py، إذ يؤدي هذا التابع إلى إنشاء سلسلة نصية من القيم الثلاث الأولى للحقل genre (إن وجدت) وإنشاء وصف قصير short_description يمكن استخدامه في موقع المدير لهذا التابع:

def display_genre(self):
    """Create a string for the Genre. This is required to display genre in Admin."""
    return ', '.join(genre.name for genre in self.genre.all()[:3])

display_genre.short_description = 'Genre'

افتح موقع الويب بعد حفظ النموذج والمدير المُحدَّث وانتقل إلى صفحة قائمة الكتب، إذ يجب أن تشاهد قائمة كتب مشابهة للقائمة التالية:

07_admin_improved_book_list.png

النموذج Genre (والنموذج Language إذا عرّفته) لهما حقل واحد، لذلك لا جدوى من إنشاء نموذج إضافي لهما لعرض حقول إضافية.

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

إضافة مرشحات القائمة

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

class BookInstanceAdmin(admin.ModelAdmin):
    list_filter = ('status', 'due_back')

سيتضمن عرض القائمة الآن مربع ترشيح على اليمين. لاحظ كيف يمكنك اختيار التواريخ والحالة لترشيح القيم:

08_admin_improved_bookinstance_list_filters.png

تنظيم تخطيط العرض التفصيلي

تضع العروض التفصيلية افتراضيًا كل الحقول عموديًا بترتيب التصريح عنها في النموذج، ولكن يمكنك تغيير ترتيب التصريح وما هي الحقول المعروضة (أو المستبعدة) وما إذا كانت الأقسام تُستخدَم لتنظيم المعلومات وما إذا كانت الحقول معروضة أفقيًا أو عموديًا وما هي عناصر واجهة التعديل المُستخدَمة في استمارات المدير.

ملاحظة: تُعَد نماذج موقع المكتبة المحلية LocalLibrary بسيطةً نسبيًا، لذا لا توجد حاجة كبيرة لتغيير التخطيط، ولكن سنجري بعض التغييرات على أية حال لنوضّح لك كيفية تطبيق ذلك.

التحكم في الحقول المعروضة وتنسيقها

حدّث الصنف AuthorAdmin لإضافة السطر fields كما يلي:

class AuthorAdmin(admin.ModelAdmin):
    list_display = ('last_name', 'first_name', 'date_of_birth', 'date_of_death')

    fields = ['first_name', 'last_name', ('date_of_birth', 'date_of_death')]

تسرد السمة fields فقط الحقول التي ستُعرَض في الاستمارة وفق ترتيبها، إذ تُعرَض الحقول عموديًا افتراضيًا، ولكن ستُعرَض أفقيًا إذا جمّعتها ضمن صف كما هو موضح في حقول "date" السابقة.

انتقل إلى عرض المؤلف التفصيلي في موقعك، إذ يجب أن يظهر الآن كما يلي:

09_admin_improved_author_detail.png

ملاحظة: يمكنك أيضًا استخدام السمة exclude للتصريح عن قائمة السمات التي ستُستبعَد من الاستمارة، إذ ستُعرَض جميع السمات الأخرى في النموذج.

تقسيم العرض التفصيلي

يمكنك إضافة أقسام Sections لتجميع معلومات النموذج ذات الصلة في الاستمارة التفصيلية باستخدام السمة fieldsets. لدينا في النموذج BookInstance معلومات تتعلق بما هو الكتاب (name و imprint و id) ومتى سيكون متاحًا (status و due_back)، إذ يمكننا إضافة هذه المعلومات إلى الصنف BookInstanceAdmin باستخدام الخاصية fieldsets كما يلي:

@admin.register(BookInstance)
class BookInstanceAdmin(admin.ModelAdmin):
    list_filter = ('status', 'due_back')

    fieldsets = (
        (None, {
            'fields': ('book', 'imprint', 'id')
        }),
        ('Availability', {
            'fields': ('status', 'due_back')
        }),
    )

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

انتقل الآن إلى عرض نسخة الكتاب في موقعك، إذ يجب أن تظهر الاستمارة كما يلي:

10_admin_improved_bookinstance_detail_sections.png

تعديل السجلات المضمن

يكون في بعض الأحيان من المنطقي أن تكون قادرًا على إضافة سجلات في الوقت نفسه، فمن المنطقي مثلًا أن يكون لديك معلومات الكتاب ومعلومات نسخ محددة حصلت عليها في صفحة التفاصيل نفسها. يمكنك تطبيق ذلك من خلال التصريح عن السمة inlines من النوع TabularInline (تخطيط أفقي) أو StackedInline (تخطيط عمودي تمامًا مثل تخطيط النموذج الافتراضي). يمكنك إضافة معلومات نسخ الكتاب BookInstance مضمنة في تفاصيل الكتاب Book من خلال تحديد السمة inlines في الصنف BookAdmin:

class BooksInstanceInline(admin.TabularInline):
    model = BookInstance

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    list_display = ('title', 'author', 'display_genre')

    inlines = [BooksInstanceInline]

انتقل الآن إلى عرض النموذج Book في موقعك، وسترى الآن في الأسفل نسخ الكتاب المتعلقة به أسفل حقول نوع الكتاب مباشرةً:

11_admin_improved_book_detail_inlines.png

كل ما فعلناه في هذه الحالة هو التصريح عن الصنف TabularInline المُضمَّن الذي يضيف فقط جميع الحقول من النموذج المُضمَّن inlined. يمكنك تحديد جميع أنواع المعلومات الإضافية للتخطيط بما في ذلك الحقول المراد عرضها وترتيبها وما إذا كانت للقراءة فقط أم لا وغير ذلك (اطلع على TabularInline لمزيد من المعلومات).

ملاحظة: هناك بعض القيود في هذه الوظيفة، إذ لدينا في لقطة الشاشة السابقة ثلاث نسخ حالية من الكتاب متبوعة بثلاثة عناصر بديلة لنسخ كتب جديدة، والتي تبدو متشابهة جدًا. يُفضَّل عدم وجود نسخ كتب احتياطية افتراضيًا وإضافتها فقط باستخدام ارتباط إضافة نسخة كتاب أخرى Add another Book instance، أو أن تكون قادرًا فقط على سرد نماذج BookInstance بوصفها ارتباطات غير قابلة للقراءة من هنا. يمكن تحقيق الخيار الأول من خلال ضبط السمة extra على القيمة "0" في النموذج BooksInstanceInline (جرّبها بنفسك).

تحدى نفسك

لقد تعلمنا الكثير في هذا القسم، لذا حان الوقت الآن لتجربة بعض الأمور وهي:

  • أضف لعرض قائمة BookInstance شيفرة برمجية لعرض الكتاب والحالة وتاريخ الاسترجاع والمعرّف (بدلًا من النص الافتراضي للتابع ‎__str__()‎).
  • أضف قائمة مُضمَّنة لعناصر الكتاب Book إلى عرض Author التفصيلي باستخدام الأسلوب نفسه الذي استخدمناه مع Book و BookInstance.

الخلاصة

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

ترجمة -وبتصرُّف- للمقال Django Tutorial Part 4: Django admin site.

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...