تطبيق عملي لتعلم إطار عمل جانغو – الجزء الأول: إنشاء موقع ويب هيكلي لمكتبة محلية
يُعد إطار العمل “جانغو” (Django) من أقوى أدوات تطوير الويب التي تعتمد على لغة البرمجة بايثون، ويتميز بسرعته، أمانه، وإمكاناته المتقدمة في تطوير تطبيقات ويب متكاملة ومتجاوبة. صُمّم جانغو لتسهيل بناء مواقع الويب المعقدة بطريقة منظمة وقابلة للتوسع، مما يجعله خياراً مثالياً لإنشاء تطبيقات مؤسسية مثل نظم إدارة المكتبات. في هذا المقال، سيتم التطرق إلى تطبيق عملي شامل يُجسد إنشاء موقع ويب هيكلي لمكتبة محلية باستخدام جانغو، مع توضيح الخطوات التقنية اللازمة لتطوير بنية أولية صلبة لهذا النظام.
مقدمة حول بنية المشروع
يهدف هذا التطبيق إلى تصميم واجهة إدارة شاملة لمكتبة محلية، تتضمن إدارة الكتب، المؤلفين، الفئات، والمستخدمين الذين يستعيرون الكتب. ستُستخدم مزايا جانغو في تنظيم النماذج (Models)، واجهات الإدارة (Admin), إعدادات التوجيه (URLs), القوالب (Templates), والتفاعلات الخلفية (Views) ضمن بنية مشروع مرتبة وفقاً لأفضل ممارسات تطوير الويب.
تهيئة بيئة العمل
قبل الشروع في تطوير المشروع، من الضروري تهيئة بيئة افتراضية باستخدام أدوات بايثون، لتجنب تعارض المكتبات وضمان سهولة التحكم في الإصدارات. يتم ذلك عبر الأوامر التالية:
bashpython -m venv venv
source venv/bin/activate # على أنظمة Linux/MacOS
venv\Scripts\activate.bat # على Windows
pip install django
بعد تهيئة البيئة وتثبيت جانغو، يتم إنشاء مشروع جديد:
bashdjango-admin startproject library_project
cd library_project
إنشاء التطبيق الأساسي داخل المشروع
في جانغو، يتكون المشروع من عدة تطبيقات مستقلة تتعاون معاً. سنبدأ بإنشاء تطبيق خاص بإدارة المكتبة:
bashpython manage.py startapp library_app
ثم يتم إضافة التطبيق إلى إعدادات المشروع داخل ملف settings.py:
pythonINSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
...
'library_app',
]
إنشاء النماذج (Models)
في هذه المرحلة، يتم تحديد الكيانات الأساسية التي سيتم التعامل معها في المكتبة، وتُعرّف على شكل نماذج جانغو. أبرز هذه الكيانات:
-
الكتاب (Book)
-
المؤلف (Author)
-
الفئة (Category)
-
النسخ (BookInstance)
-
المستخدم أو المستعير (Borrower)
نموذج الكتاب:
pythonfrom django.db import models
class Category(models.Model):
name = models.CharField(max_length=200, help_text="أدخل فئة الكتاب (مثلاً: رواية، علوم...)")
def __str__(self):
return self.name
class Author(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
date_of_birth = models.DateField(null=True, blank=True)
def __str__(self):
return f"{self.last_name}, {self.first_name}"
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.SET_NULL, null=True)
summary = models.TextField(max_length=1000, help_text="ملخص موجز عن الكتاب")
isbn = models.CharField('ISBN', max_length=13, unique=True)
category = models.ManyToManyField(Category)
def __str__(self):
return self.title
نموذج النسخة:
pythonimport uuid
class BookInstance(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, help_text="معرف فريد للنسخة")
book = models.ForeignKey(Book, on_delete=models.RESTRICT, null=True)
imprint = models.CharField(max_length=200)
due_back = models.DateField(null=True, blank=True)
borrower = models.ForeignKey('auth.User', on_delete=models.SET_NULL, null=True, blank=True)
LOAN_STATUS = (
('m', 'صيانة'),
('o', 'مستعار'),
('a', 'متوفر'),
('r', 'محجوز'),
)
status = models.CharField(max_length=1, choices=LOAN_STATUS, blank=True, default='m')
def __str__(self):
return f"{self.id} ({self.book.title})"
إعداد الواجهة الإدارية
جانغو يوفر لوحة تحكم جاهزة لإدارة النماذج. بعد إنشاء النماذج، يجب تسجيلها في ملف admin.py:
pythonfrom django.contrib import admin
from .models import Book, Author, Category, BookInstance
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Category)
admin.site.register(BookInstance)
ثم تُنفّذ الأوامر التالية لتحديث قاعدة البيانات:
bashpython manage.py makemigrations python manage.py migrate
إنشاء المستخدم الإداري وتشغيل الخادم
للدخول إلى لوحة الإدارة، يجب إنشاء حساب مستخدم بصلاحيات المشرف:
bashpython manage.py createsuperuser
بعدها، يتم تشغيل الخادم المحلي:
bashpython manage.py runserver
عند فتح الرابط http://127.0.0.1:8000/admin/، يمكن تسجيل الدخول ورؤية النماذج المُدارة.
إعداد القوالب والواجهات العامة
لإنشاء صفحات أمامية للمكتبة، يتم إنشاء مجلد templates داخل التطبيق، ثم يتم تخصيص القوالب باستخدام لغة جانغو للقوالب (Django Template Language). يُفضل بدء العمل بقاعدة موحدة للقوالب الأساسية:
html
html>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>{% block title %}مكتبة محلية{% endblock %}title>
head>
<body>
<div id="content">
{% block content %}
{% endblock %}
div>
body>
html>
ثم يُنشأ قالب لعرض قائمة الكتب:
html
{% extends "base_generic.html" %}
{% block title %}قائمة الكتب{% endblock %}
{% block content %}
<h1>الكتب المتوفرةh1>
<ul>
{% for book in book_list %}
<li>{{ book.title }} (تأليف: {{ book.author }})li>
{% endfor %}
ul>
{% endblock %}
إعداد العروض (Views) وملفات التوجيه (URLs)
يتم تعريف العروض في views.py:
pythonfrom django.shortcuts import render
from .models import Book
def book_list(request):
books = Book.objects.all()
return render(request, 'book_list.html', {'book_list': books})
ثم تُربط العروض بمسارات عبر ملف urls.py:
pythonfrom django.urls import path
from . import views
urlpatterns = [
path('books/', views.book_list, name='book_list'),
]
ويُضاف هذا الملف إلى مشروع جانغو الرئيسي:
python# في library_project/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('library_app.urls')),
]
إضافة جدول للإحصائيات العامة
لتقديم ملخص إحصائي عن عدد الكتب والمؤلفين والفئات، يمكن إنشاء عرض جديد يُظهر هذه البيانات باستخدام جدول HTML:
pythondef index(request):
num_books = Book.objects.count()
num_instances = BookInstance.objects.count()
num_authors = Author.objects.count()
num_categories = Category.objects.count()
context = {
'num_books': num_books,
'num_instances': num_instances,
'num_authors': num_authors,
'num_categories': num_categories,
}
return render(request, 'index.html', context)
html
{% extends "base_generic.html" %}
{% block title %}لوحة الإحصائيات{% endblock %}
{% block content %}
<h1>إحصائيات المكتبةh1>
<table border="1">
<tr><th>الوصفth><th>العددth>tr>
<tr><td>عدد الكتبtd><td>{{ num_books }}td>tr>
<tr><td>عدد النسخtd><td>{{ num_instances }}td>tr>
<tr><td>عدد المؤلفينtd><td>{{ num_authors }}td>tr>
<tr><td>عدد الفئاتtd><td>{{ num_categories }}td>tr>
table>
{% endblock %}
جدول المكونات الأساسية للنظام
| العنصر | الوصف |
|---|---|
Book |
يمثل الكتاب ويتضمن عنوانه ومؤلفه وفئته وملخصه |
Author |
يمثل المؤلف ويخزن اسمه وتاريخ ميلاده |
Category |
يمثل فئة الكتاب مثل: رواية، سيرة، علم |
BookInstance |
يمثل نسخة فعلية من الكتاب ويمكن تتبع استعارتها |
User |
يمثل المستخدم الذي يستعير الكتب من المكتبة |
| لوحة الإدارة | تُستخدم لإدارة الكتب والمؤلفين والنسخ بطريقة مرئية |
| القوالب (Templates) | تُستخدم لإنشاء واجهات HTML ديناميكية بناءً على البيانات |
| العروض (Views) | تتحكم في كيفية عرض البيانات للمستخدم عبر القوالب |
| التوجيه (URLs) | يحدد المسارات التي تقود إلى كل صفحة من صفحات الموقع |
الخلاصة التقنية
يمثل هذا الجزء الأول من التطبيق العملي باستخدام جانغو نواة مشروع متكامل لإدارة مكتبة محلية. تم إنشاء بنية هيكلية قوية تشمل نماذج رئيسية، واجهة إدارة ديناميكية، وتكامل بين قاعدة البيانات والواجهات الأمامية. في الأجزاء القادمة، يمكن توسيع هذا النظام بإضافة ميزات متقدمة مثل: تسجيل الإعارات، سجل استعارات المستخدم، فلترة البحث، التوثيق والتحكم في الصلاحيات، وربط واجهات API لتقديم خدمات عبر الهواتف المحمولة أو التطبيقات الأخرى.
المراجع:
-
Django documentation: https://docs.djangoproject.com/en/stable/
-
Two Scoops of Django 3.x by Audrey Roy Greenfeld and Daniel Roy Greenfeld.

