ما سنقوم به في هذا الدرس هو إنشاء شيء يمكننا من تخزين مواضيع المدونة التي سنقوم بإنشاءها وحتى نستطيع عمل ذلك علينا أولا أن نتكلم قليلا عن ما يسمى الكائنات .
الكائنات
هناك مصلح يتم تداوله كثيرا في عالم البرمجة وهو برمجة كائنية التوجه والفكرة هي انه بدلا من كتابة كل التعليمات البرمجية المملة يمكننا إنشاء نماذج الأشياء التي نريدها وتحديد كيفية تفاعلها مع بعضها البعض.
إذا ماهي الكائنات ؟ هي عبارة عن مجموعة من الخصائص و الإجراءات و المثال التالي يوضح العملية بشكل جيد
إذا كنا نريد إنشاء نموذج قط نقوم بإنشاء كائن Cat وسيكون له بعض الخصائص مثل color,age,mod وطبعا سيكون لهذا القط مالك owner (وقد يكون هذا المالك عبارة عن كائن أيضا وإذا كان القط متشرد ستكون هذه الخاصية فارغة )
وسيكون للقط بعض الخصائص الأخرى مثل الطعام feed والذي سيكون طعام القط Catfood طبعا وسيكون عبارة عن كائن اخر مستقل عن كائن القط Cat وله خصائص خاصة به Taste.
Cat -------- color age mood owner feed(cat_food) CatFood -------- taste
ولذلك فإن الفكرة هي وصف الأشياء الحقيقية من خلال الكود مع مجموعة من الخصائص والتي تسمى (object properties) والإجراءات التي تسمى (methods).
إذا كيف سنقوم بإنشاء نموذج الخاص بمواضيع المدونة ؟
وللإجابة على هذا السؤال علينا أن نطرح سؤال أخر ما هي مواضيع المدونة وماهي الخصائص التي تحتويها ؟
من المؤكد أن مواضيع المدونة تحتاج إلى مجموعة من النصوص وهو المحتوى بالإضافة الى عنوان الموضوع كما سيكون من الجيد ان نعرف من هو كاتب الموضوع وبالتالي سنحتاج الى كاتب وأخيرا نريد معرفة تاريخ نشر الموضوع .
Post -------- title text author created_date published_date
أي نوع من الأشياء يمكن القيام به مع مواضيع المدونة ؟ إذ أنه سيكون من الجميل أن يكون لدينا بعض method التي تقوم بنشر المواضيع .
إذا نحن بحاجة الى publish
method
الأن بعدما أصبحنا نعلم مالذي نحن بحاجة إليه دعونا نبدأ بإنشاء النماذج في جانغو.
نماذج جانغو
النموذج في جانغو عبارة عن كائن من نوع خاص يتم حفظه في قواعد البيانات وهي عبارة عن مجموعة من البيانات وهي المكان الذي سنقوم بتخزين فيه معلومات المستخدمين، مواضيع المدونة إلخ … وسنقوم بإستخدام قواعد البيانات الإفتراضية لجانغو SQLite لتخزين بياناتنا .
كما يمكن تعريف النماذج بأنها وصف للبيانات في قواعد البيانات ممثلة في كود بايثون وهي عبارة عن تصميم البيانات الخاصة بك وهي تعادل عبارة CREATE TABLE الخاصة SQL إلا أنها عبارة عن كود بايثون بدلا من كونها عبارة SQL وهي تحتوي على الكثير من الخصائص وليست مجرد تعريف العمود مثل قاعدة البيانات .
إنشاء التطبيق
حتى نحافط على أناقة العمل سنقوم بإنشاء تطبيق منفصل داخل مشروعنا لأنه من الجيد أن يكون كل شيء منظم منذ البداية، ولإنشاء التطبيق علينا بكتابة الأمر التالي داخل سطر الأوامر
(myvenv) ~/pyarab$ python manage.py startapp blog
بعد تنفيذ الامر السابق ستلاحظ انه تم إنشاء دليل جديد تحت إسم blog ويحتوي على مجموعة من الملفات ، وسيكون مجلد المشروع يحتوي على مجلدات وملفات كالأتي :
pyarab ├── mysite | __init__.py | settings.py | urls.py | wsgi.py ├── manage.py └── blog ├── migrations | __init__.py ├── __init__.py ├── admin.py ├── models.py ├── tests.py └── views.py
بعد إنشاء التطبيق نحتاج أيضا إلى إخبار جانغو أن عليه إستخدام التطبيق الجديد و للقيام يهذا نقوم بفتح ملف الإعدادات الموجودة على المسار mysite/settings.py ونقوم بالبحث عن INSTALLED_APPS ثم نقوم بإضافة السطر التالي , ‘blog’ قبل العلامة ( ليكون الشكل التالي :
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'blog',
إنشاء نموذج مواضيع المدونة
في الملف الموجود في المسار blog/models.py نقوم بتعريف جميع الكائنات المسماة النماذج (Models) وهذا هو المكان الذي سنقوم بتعيين مواضيع المدونة فيه .
دعونا نقوم بفتح الملف ونحذف جميع محتوياته ونكتب الكود التالي :
from django.db import models from django.utils import timezone class Post(models.Model): author = models.ForeignKey('auth.User') title = models.CharField(max_length=200) text = models.TextField() created_date = models.DateTimeField( default=timezone.now) published_date = models.DateTimeField( blank=True, null=True) def publish(self): self.published_date = timezone.now() self.save() def __str__(self): return self.title
قد يبدو لك الكود صعب ومخيف من الوهلة الأولى ولكن لا تقلق سأقوم بشرح الكود سطر بسطر.
جميع السطور التي تبدأ ب from و import هي سطور تقوم بإضافة بعض الخصائص من ملفات اخرى وذلك حتى نتجنب نسخ ولصق نفس الكود في كل ملف كما يمكننا إضافة بعض الأجزاء بإستخدام from …. import …
class Post(models.Model)
هذا السطر يقوم بإنشاء النموذج الخاص بنا وهو عبارة عن كائن .
- Class عبارة عن كلمة محجوزة وهي تعني أننا بصدد إنشاء كائن .
- Post هو إسم النموذج الذي نقوم بإنشاءه (يمكننا تسميته بإي إسم نريد ولكن علينا تجنب الكلمات المحجوزة الخاصة وإستعمال المسافات ).
- models.Model تعني ان النموذج Post عبارة عن نموذج جانغو و بالتالي فإن جانغو يعرف أنه يجب عليه حفظه في قاعدة البيانات .
الأن سنقوم بتعيين الخصائص التي تكلمنا عنها “title,author,text,created_date,published_date” وسنقوم أيضا بتعيين نوع كل حقل من حقول الخصائص (هل هي عبارة عن نصوص ، أرقام،تواريخ،مستخدمين أو لها خصائص لكائن أخر).
- medels.CharField حقل خاص بالنصوص مع حد أقصى من الحروف .
- models.TextField حقل خاص بالنصوص بدون حد وهو مناسب لمحتوى المواضيع.
- models.DatetimeField للتواريخ والوقت .
- models.ForiegnKey رابط لنموذج اخر.
لن أقوم بشرح جميع النماذج لأن ذلك يستغرق الكثر من الوقت وكل ما صادفنا نوع جديد سنقوم بشرحه ولمن أراد التعرف على المزيد عليه زيارة موقع جانغو الرسمي :
(https://docs.djangoproject.com/en/1.8/ref/models/fields/#field-types
نأتي الأن الى السطر التالي :
def publish(self):
وهو method الخاص بالنشر الذي تكلمنا عنه من قبل، def تعني إنشاء دالة أو method و publish هو إسمها وطبعا يمكنك تغيير إسمها بالشروط المتفق عليها (عدم إستخدام الكلمات المحجوزة أو مسافات ).
methods عادة ماتقوم بإرجاع (return) شيء ما ، وفي مثالنا هذا ستقوم بعرض نص مع عنوان الموضوع عند إستدعاء دالة __str__()
إنشاء الجداول للنماذج في قاعدة البيانات .
الخطوة الأخيرة لهذا اليوم هي إضافة نموذجنا الجديد إالى قاعدة البيانات وقبل ذلك علينا أن نعلم جانغو أننا قمنا ببعض التغييرات في نموذجنا (الذي قمنا بإنشاء قبل قليل) قم بفتح الطرفية وأكتب الامر التالي :
python manage.py makemigrations blog
وسيكون الناتج
(myvenv) ~/pyarab$ python manage.py makemigrations blog Migrations for 'blog': 0001_initial.py: - Create model Post
أعد لنا جانغو ملف migration وكل ما علينا فعله هو التطبيق على قواعد البيانات نكتب الأمر التالي على الطرفية :
python manage.py migrate blog
والنتيجة ستكون :
(myvenv) ~/pyarab$ python manage.py migrate blog Operations to perform: Apply all migrations: blog Running migrations: Rendering model states... DONE Applying blog.0001_initial... OK
ألف مبروك أصبح النموذج الخاص بنا على قواعد البيانات وبإمكاننا الأن كتابة مواضيع على مدونتنا وهذا ما سنقوم به في المرة القادمة.