البرمجة

إنشاء موقع مكتبة بجانغو

تطبيق عملي لتعلم إطار عمل جانغو – الجزء الأول: إنشاء موقع ويب هيكلي لمكتبة محلية

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


مقدمة حول بنية المشروع

يهدف هذا التطبيق إلى تصميم واجهة إدارة شاملة لمكتبة محلية، تتضمن إدارة الكتب، المؤلفين، الفئات، والمستخدمين الذين يستعيرون الكتب. ستُستخدم مزايا جانغو في تنظيم النماذج (Models)، واجهات الإدارة (Admin), إعدادات التوجيه (URLs), القوالب (Templates), والتفاعلات الخلفية (Views) ضمن بنية مشروع مرتبة وفقاً لأفضل ممارسات تطوير الويب.


تهيئة بيئة العمل

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

bash
python -m venv venv source venv/bin/activate # على أنظمة Linux/MacOS venv\Scripts\activate.bat # على Windows pip install django

بعد تهيئة البيئة وتثبيت جانغو، يتم إنشاء مشروع جديد:

bash
django-admin startproject library_project cd library_project

إنشاء التطبيق الأساسي داخل المشروع

في جانغو، يتكون المشروع من عدة تطبيقات مستقلة تتعاون معاً. سنبدأ بإنشاء تطبيق خاص بإدارة المكتبة:

bash
python manage.py startapp library_app

ثم يتم إضافة التطبيق إلى إعدادات المشروع داخل ملف settings.py:

python
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', ... 'library_app', ]

إنشاء النماذج (Models)

في هذه المرحلة، يتم تحديد الكيانات الأساسية التي سيتم التعامل معها في المكتبة، وتُعرّف على شكل نماذج جانغو. أبرز هذه الكيانات:

  1. الكتاب (Book)

  2. المؤلف (Author)

  3. الفئة (Category)

  4. النسخ (BookInstance)

  5. المستخدم أو المستعير (Borrower)

نموذج الكتاب:

python
from 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

نموذج النسخة:

python
import 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:

python
from 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)

ثم تُنفّذ الأوامر التالية لتحديث قاعدة البيانات:

bash
python manage.py makemigrations python manage.py migrate

إنشاء المستخدم الإداري وتشغيل الخادم

للدخول إلى لوحة الإدارة، يجب إنشاء حساب مستخدم بصلاحيات المشرف:

bash
python manage.py createsuperuser

بعدها، يتم تشغيل الخادم المحلي:

bash
python 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:

python
from 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:

python
from 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:

python
def 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 لتقديم خدمات عبر الهواتف المحمولة أو التطبيقات الأخرى.


المراجع: