(7) ورشة تطوير تطبيقات الويب باستخدام Django: موقع إدارة جانقو - Django Admin Site


#1

أهلا بالجميع

فهرس موضوعات الورشة

فهرس موضوعات ورشة تطوير تطبيقات الويب باستخدام Django

في الدرس السابق تعلمنا كيف نتعامل مع قاعدة البيانات عن طريق ال shell في هذا الدرس سنتعامل معاها عن طريق موقع الإدارة

ماهو موقع إدارة جانقو؟

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

كيف يمكنني الدخول الى موقع الإدارة؟

قبل كل شيء قم بتشغيل سيرفرجانقو بهذا الأمر:

python manage.py runserver

ثم ادخل على هذا ال url http://127.0.0.1:8000/admin/ سيتم اعادة نقلك الى صفحة تسجيل دخول الخاصة بالموقع

لكي تستطيع الدخول الى admin تحتاج الى حساب مستخدم مدير لديه كل الصلاحيات يمكنه انشاء تعديل حذف عرض اي كائن بدون اي قيود

كيف يمكنني انشاء حساب مدير؟

ادخل هذا الأمر

python manage.py createsuperuser

سيتم سؤالك اسم المستخدم , الايميل, باسورد, تأكيد باسورد قم بملء هذه البيانات وسيكون لديك مستخدم مدير جديد لاحظ الصورة المتحركة بالأسفل

الآن ارجع الى المتصفح وقم بتسجيل الدخول سيظهر لك الموقع

  • الجزء الأيمن خاص بعرض أخر النشاطات التي تم القيام بها

3

  • الجزء الأيسر خاص بعرض التطبيقات مع ال models الخاصة بهم لاحظ انه يمكنك اضافة وتعديل ال models عبر الرموز التي على اليمين

2

كيف يمكنني اضافة Product و Category الى موقع الإدارة؟

في ملف shop/admin.py اضف هذا الكود

from django.contrib import admin
from . import models


admin.site.register(models.Product) # This will add Product to admin site
admin.site.register(models.Category) # This will add Category to admin site

قم بحفظ التعديلات واعمل تحديث لل admin ستجد انه تم اضافة models الى الموقع بنجاح.

كيف يمكنني اضافة كائن؟

هناك طريقتين:

  • اما من الضغط على زر Add بجانب اسم ال Model

  • او الضغط على ال Model من هنا سيدخلك على صفحة خاصة بال model

اضغط على زرADD CATEGORY المحددة باللون الأخضر ستجد انه تم نقلك الى صفحة الإضافة

لاحظ ان Name خطه عريض وهذا يعني انه مطلوب و Slug خطه رقيق وهذا يعني انه غير مطلوب. قم بكتابة اسم الصنف واضغط على Save لاحظ انه سيعيدك الى صفحة التصنيفات.

لاحظ الرسالة التي ظهرت تفيد بأن عملية الإضافة تمت بنجاح وأيضا لاحظ القسم الخاص بعرض الكائنات

كيفية تعديل كائن؟

قم بالدخول على الكائن ستجد النموذج ممتلئ بالبيانات المخزنة يمكنك تعديل اي منها ثم الضغط على Save

كيفية حذف كائن؟

  • أولا قم بالدخول على ال Model التي تريد حذف منها كائن أو كائنات معينه

  • ثانيا هناك طريقتين:

** الطريقة الأولى**

  1. قم بتحديد الكائنات المراد حذفها
  2. قم بالضغط على قائمة Actions واختيار Delete selected categorys
  3. قم بالضغط على زر Go

الطريقة الثانية

  1. قم بالدخول على الكائن المراد حذفه
  2. قم بالضغط على زر Delete

في الطريقتين السابقتين جانقو ستنقلك الى صفحة لتأكيد الحذف

  • اضغط على Yes, I’m sure لتأكيد الحذف

  • اضغط على No, take me back لإلغاء الحذف

كيف يمكنني تخصيص موقع الإدارة ؟

اي شيء له علاقة بال admin نقوم بعمله في shop/admin.py , مثل مالدينا admin.site.register هناك الكثير من الخيارات في الكائن admin.site سنتطرق الى بعض هذه الخيارات الآن

admin.site.site_header = "Coretabs Online Shop Administration"

هذه الخاصية ستقوم بتغير الترويسة الرئيسية الخاصة بالموقع

admin.site.site_title = "Coretabs Online Shop Administration"

هذه الخاصية ستقوم بتغير عنوان الموقع الى Site administration | Coretabs Online Shop Administration

admin.site.index_title = ""

هذه الخاصية ستغير قيمة الترويسة “Site administration” الى نص فارغ و أيضا ستغير العنوان الى “| Coretabs Online Shop Administration”

كيفية تخصيص قائمة الكائنات؟

سنستعمل في هذه الحالة ModelAdmin وهو الذي سيعطينا امكانية تخصيص قائمة الكائنات.

# shop/admin.py

class ProductAdmin(admin.ModelAdmin):
    pass

admin.site.register(models.Product, ProductAdmin)

او يمكننا جعل تسجيل ال Product كا decorator بهذا الشكل

# shop/admin.py

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
    pass

ال ModelAdmin تشبه طريقة عمل Meta لل Model سنقوم بتعريف خواص معينه تضيف لنا شيء للموقع

الخاصية date_hierarchy؟

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
    date_hierarchy = 'created_at'

الخاصية date_hierarchy تقوم بإضافة خط زمني لقائمة المنتجات يمكنك من خلالها قلترة عرض المنتجات مثلا (المنتجات من شهر مارس)

لاحظ انه تم اضافة الخط الزمني ويمكنك فلترة البيانات منه

الخاصية search_fields؟

نستخدم هذه الخاصية لتفعيل ميزة البحث في قائمة الكائنات , تستقبل قائمة بالحقول المراد البحث عنها لنأخذ مثال

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
    date_hierarchy = 'created_at'
    search_fields = ['name']

لاحظ انه تم اضافة مربع البحث وقمنا بالبحث عن النص “app” وكان الناتج عرض الكائن الذي يحتوي على هذا النص

الخاصية list_display

افتراضية جانقو تقوم بعرض النص الذي يمثل الكائن في قائمة الكائنات , ماتتيحه لنا هذه الخاصية هو امكانية عرض حقل او اكثر من حقل على شكل جدول فقط مرر لها الحقول المراد عرضها لنأخذ مثال

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
   date_hierarchy = 'created_at'
   search_fields = ['name']
   list_display = ('name', 'price', 'stock', 'category',)

لاحظ انه تم عرض الحقول name, price, stock, category على شكل جدول

الخاصية list_filter

تتيح لك هذه الخاصية اضافة فلترة للكائنات حسب حقل معين , قم بتمرير الحقول التي تريد ان يتم الفلترة عليها ويجب ان يكون نوع الحقل احد هذه BooleanField, CharField, DateField, DateTimeField, IntegerField, ForeignKey or ManyToManyField لنأخذ مثال

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
   date_hierarchy = 'created_at'
   search_fields = ['name']
   list_display = ('name', 'price', 'stock', 'category',)
   list_filter = ('created_at', 'category',)

13

لاحظ انه تمت اضافة هذا الجزء في يمين الجدول والذي يمكنك ان تختار منه فلتر معين لفلترة الكائنات طبعا لا يمكنني تجربة التاريخ لأن ليس لدي منتجات بتواريخ قبل اليوم :smile: .

ماهو Admin action؟

نستخدم admin action عندما نحتاج تعديل أكثر من كائن في مرة واحدة , جانقو تأتي مع action افتراضي الا وهو Delete selected objects, يمكننا عمل action بأنفسنا وتسجيله في موقع الإدارة

لاحظ Delete selected products هو admin action يأتي مع جانقو افتراضيا لكل ال models

كيف يمكنني كتابة action خاص بي؟

ال action هو عبارة عن function يتم استدعائها عن الضغط على ال action من ال admin site, هذه الدالة تقبل ثلاثة بارانترات وهم كالآتي

  • ال ModelAdmin الحالية

  • HttpRequest يمثل ال request الحالي

  • QuerySet بها الكائنات التي تم تحديدها

من هنا نعرف ان هيكلية ال action تكون هكذا:

def func_name(modeladmin, request, queryset):
    # Code here

لنأخذ مثال واضح

كيف يمكنني جعل ال price صفر لكل المنتجات المحدده؟

في ملف shop/admin.py نكتب هذا الكود

def make_price_zero(modeladmin, request, queryset):
    queryset.update(price=0)

هذه الدالة ستقوم بتعديل ال price لكل المنتجات المحدده وجعله صفر.

دعنا نضف شيء بسيط لإعطاء وصف للدالة مثل ال action Delete selected product

def make_price_zero(modeladmin, request, queryset):
    queryset.update(price=0)


make_price_zero.short_description = "Make selected products free"

الآن جرب الدخول على قائمة المنتجات وقم بالنقرعلى القائمة المنسدلة Actions, للأسف لن تجد ال action الخاص بك :pensive:

كيف أجعل ال action تظهر في القائمة المنسدلة Actions?

يجب عليك تحديد ال action(s) خاصتك في ال ModelAdmin , هناك خاصية اسمها actions تقبل قائمة بها الدوال الخاصة بكل

@admin.register(models.Product)
class ProductAdmin(admin.ModelAdmin):
  date_hierarchy = 'created_at'
  search_fields = ['name']
  list_display = ('name', 'price', 'stock', 'category',)
  list_filter = ('created_at',)
  actions = [make_price_zero]

الآن قم بالدخول على قائمة المنتجات وجرب اول action لك :wink:

ماهي المهمة المطلوبة؟

  • قم بإضافة و تعديل وحذف تصنيفات ومنتجات من عندك بواسطة ال admin

  • قم بجعل قائمة التصنيفات تظهر الإسم والوصف

  • قم بإضافة مربع بحث لثئمة التصنيفات

  • ثم بإضافة خط زمني لقائمة التصنيفات

  • قم بإضافة action لقائمة المنتجات يقوم بعمل خصم 20% للمنتجات المحدده

ملحق

The Django Admin Site

Admin Actions

تسليم الحلول

(8) ورشة تطوير تطبيقات الويب باستخدام Django: مشاركة حلول موقع إدارة جانقو - Django Admin Site


#2

يعطيك الف عافية ان شاء الله مزيد من العطاء


#3

شرح جميل و وافي أخي @ahmedalrifai
بارك الله فيك


#4

هل اعيد كتابة الدالة هكذا ام يجب استبدال AuthorAdmin" ب "ProductAdmin "


#5

نعم اعد كتابتها الى ProductAdmin.
لا أعرف لماذا كتبتها Author بدل Product :sweat_smile:


#6

جل من لا يسهو اخي العزيز , جزاك الله خيرا علي مجهودك معنا و زادك علما


#7

نعم صحيح, هذا من واجبي اخي بالتوفيق لك :slightly_smiling_face:


#8

أرجوا المساعدة حين ادخل هذه التعليمات لملف admin.py يعطيني models غير معرفهه استدعيها من from django.db import models يعطيني Product غير معرف !!

ما الحل؟؟ :persevere:


#9
    raise AlreadyRegistered('The model %s is already registered' % model.__name__)
django.contrib.admin.sites.AlreadyRegistered: The model Product is already registered

هذه رسالة الخطأ


#10

هل قمت بحذف تسجيل المنتج بالطريقة العادية؟

admin.site.register(models.Product)

#11

شكراً لقد اتضحت الفكرة فهذه عدة طرق لتسجيل المنتج


#12

أرجوا التفصيل أكثر كي تكون الامور أوضح
كيف تم استخدام هذا السطر اعلاه؟؟؟؟
نحن نعلم أن التحديث كان يتم من خلال الأمر

Product.objects.update(name="hdfdfg")

نحن نعلم اننا نستخدم لغة بايثون لكن نلاحظ بعض الاشياء التي لا نفهمها وأنا اريد أن افهم الامور دون ما احفظ حفظ.
وشكراً


#13

شـرح رااائـع جـزيـت خـيـرآ .
ظـهـرت عـندي هـذه الـمشكلـه كـيف أحـلـهـا


#14

ال action يقبل ثلاث بارامترات واحد منهم هي queryset للمنتجات التي تم تحديدها وكما عرفنا سابقا ان QuerySet لديه مجموعة من الدوال للتعامل مع البيانات المخزنة واحدة منهم update

اي ان السطر

queryset.update(price=0) 

يقوم بتعديل ال price للمنتجات المخزنه به


#15

ماهي المشكلة اختي؟


#16

صـوره الـمشكله مـا رضيـت تتـحمـل :sweat_smile: . هـذه المشكـله عنـدتنـفيذ الأمـر python manage.py createsuperuser يـطلع لي
Superuser creation skipped due to not running in a TTY. You can run ‘manage.py createsuperuser’ in your project to create one manually …


#17

طيب أنا كيف فيني اتعامل مع المعامل الي داخلها؟؟!
يعني إذا بدي اخصم 20% من قيمة price


#18

شوفي هذا الجواب ممكن يفيدك


#19

هل تتذكر الدوال التي اخذناها في الدرس السابق يمكنك استعمالها مع البارامتر queryset


#20

طـيـب يـسـلـمـواااا …