العروض والقوالب في Django – الجزء الأول
في عالم تطوير الويب الحديث، يعتبر إطار العمل Django واحدًا من أكثر الأدوات استخدامًا لبناء تطبيقات ويب متكاملة وفعالة باستخدام لغة البرمجة بايثون. ومن بين الركائز الأساسية التي يعتمد عليها Django في تقديم تجربة تطوير مرنة واحترافية هي نظام العروض (Views) والقوالب (Templates)، وهما من المفاهيم الجوهرية التي تحقق فصلًا واضحًا بين منطق التطبيق وواجهة المستخدم.
هذا المقال يركز على شرح مفصل وطويل حول العروض والقوالب في Django، مع توضيح كيفية عملهما، أهميتهما، وأساليب استخدامهما في بناء تطبيقات ويب متطورة. سنبدأ بتعريف كل من العروض والقوالب، ثم نتناول تفاصيل العمل معها، ونشرح كيفية تصميم نظام عرض ديناميكي قائم على القوالب، مع تقديم أمثلة عملية وأكواد توضيحية.
1. مقدمة عن Django
قبل الدخول في التفاصيل التقنية للعروض والقوالب، من الضروري فهم الدور الذي يلعبه Django كإطار عمل لتطوير الويب. Django هو إطار عمل مفتوح المصدر مبني على لغة بايثون، يهدف إلى تسريع عملية تطوير تطبيقات الويب من خلال توفير مكونات جاهزة مثل إدارة قواعد البيانات، أنظمة التوثيق، إدارة الجلسات، وأدوات التوجيه.
تتميز Django بنمط تصميم MVC (Model-View-Controller) أو النسخة المعدلة منها وهي MVT (Model-View-Template)، حيث:
-
Model يمثل الطبقة التي تتعامل مع البيانات وقواعد البيانات.
-
View هو الطبقة التي تعالج الطلبات وتحدد كيفية الاستجابة.
-
Template هو جزء العرض الخاص بواجهة المستخدم، حيث يتم تحديد شكل ومضمون الصفحة.
في هذا السياق، تركيزنا سيكون على طبقتي العرض (Views) والقوالب (Templates).
2. مفهوم العروض (Views) في Django
2.1 تعريف العروض
العرض أو الـ View هو وحدة برمجية في Django تتلقى طلب HTTP من المستخدم، تقوم بمعالجته (مثل جلب بيانات من قاعدة البيانات أو تنفيذ عمليات منطقية)، ثم تعيد استجابة HTTP تحتوي على المحتوى المناسب.
يمكن اعتبار الـ View بمثابة نقطة التواصل بين المستخدم والبيانات، إذ يحدد ماذا سيُعرض للمستخدم وكيف.
2.2 أنواع العروض في Django
يوفر Django طريقتين رئيسيتين لإنشاء العروض:
-
العروض الوظيفية (Function-based Views – FBV): هي دوال بايثون عادية تأخذ كائن الطلب (request) كوسيط وتعيد استجابة.
-
العروض المعتمدة على الأصناف (Class-based Views – CBV): هي فئات (Classes) تستند إلى البرمجة الكائنية تسمح بإعادة استخدام الكود وتنظيمه بشكل أفضل، مع توفير وظائف جاهزة مثل عرض القوائم، النماذج، والعمليات CRUD.
2.3 كتابة عرض وظيفي بسيط
مثال بسيط لعروض وظيفية:
pythonfrom django.http import HttpResponse
def home_view(request):
return HttpResponse("مرحباً بكم في موقعنا!")
في هذا المثال، عند استقبال الطلب، يتم إرسال نص بسيط كاستجابة.
2.4 العروض وقواعد البيانات
غالبًا ما تتضمن العروض جلب البيانات من قواعد البيانات باستخدام النماذج (Models)، ثم تمرير هذه البيانات إلى القوالب لعرضها. مثال:
pythonfrom django.shortcuts import render
from .models import Article
def articles_list(request):
articles = Article.objects.all()
return render(request, 'articles/list.html', {'articles': articles})
في المثال أعلاه، يتم جلب جميع المقالات من قاعدة البيانات وتمريرها إلى قالب HTML.
3. مفهوم القوالب (Templates) في Django
3.1 تعريف القوالب
القالب هو ملف يحتوي على كود HTML مع علامات خاصة بـ Django تسمح بإدراج محتوى ديناميكي، مثل البيانات التي تم جلبها بواسطة العروض. القوالب تهدف إلى فصل منطق البرمجة عن واجهة المستخدم، بحيث يستطيع المطورون ومصممو الويب العمل بشكل مستقل.
3.2 لغة قوالب Django Template Language (DTL)
تعتمد القوالب في Django على لغة القوالب الخاصة به المعروفة بـ DTL، والتي تتضمن:
-
علامات التحكم: مثل الحلقات (for)، الشروط (if)، والامتدادات (extends).
-
المتغيرات: لاستدعاء بيانات من العرض وعرضها داخل القالب.
-
الفلاتر: لتعديل أو تنسيق البيانات المعروضة.
3.3 تركيب ملف قالب بسيط
مثال لقالب يعرض قائمة مقالات:
htmlhtml>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>قائمة المقالاتtitle>
head>
<body>
<h1>المقالات المتاحةh1>
<ul>
{% for article in articles %}
<li>{{ article.title }} - {{ article.author }}li>
{% empty %}
<li>لا توجد مقالات حالياً.li>
{% endfor %}
ul>
body>
html>
في هذا المثال:
-
{% for article in articles %}تبدأ حلقة تمر عبر جميع المقالات. -
{{ article.title }}تقوم بإدراج عنوان المقال. -
{% empty %}تعرض رسالة في حال كانت القائمة فارغة.
3.4 امتداد القوالب وإعادة الاستخدام
تتيح قوالب Django إنشاء قالب أساسي (Base Template) يمكن أن تتوارث منه باقي الصفحات، مما يسهل صيانة التصميم وتوحيده.
مثال قالب أساسي:
htmlhtml>
<html lang="ar">
<head>
<meta charset="UTF-8">
<title>{% block title %}موقعي{% endblock %}title>
head>
<body>
<header>
<h1>شعار الموقعh1>
header>
<main>
{% block content %}
{% endblock %}
main>
<footer>
حقوق النشر © 2025
footer>
body>
html>
وقالب فرعي يرث القالب الأساسي:
html{% extends "base.html" %}
{% block title %}الصفحة الرئيسية{% endblock %}
{% block content %}
<p>مرحبًا بكم في الصفحة الرئيسية!p>
{% endblock %}
4. العلاقة بين العروض والقوالب
في نظام Django، العلاقة بين العروض والقوالب هي جوهرية. العروض تتولى منطق معالجة البيانات والطلبات، بينما القوالب تتولى عرض النتائج.
عملية العمل تكون عادة بالشكل التالي:
-
المستخدم يرسل طلب HTTP (GET أو POST).
-
يتم توجيه الطلب إلى العرض المناسب عبر نظام التوجيه (URL Dispatcher).
-
يقوم العرض بمعالجة الطلب، جلب البيانات أو إجراء عمليات معينة.
-
يعيد العرض استجابة باستخدام قالب HTML مملوء بالبيانات.
-
يُعرض المحتوى على المستخدم عبر المتصفح.
5. استخدام دالة render في العروض
دالة render هي الطريقة الأكثر شيوعًا لربط العرض بالقالب، وهي تجمع بين تحميل القالب وتمرير البيانات إليه ثم توليد استجابة HTTP.
pythonfrom django.shortcuts import render
def example_view(request):
context = {'name': 'علي', 'age': 30}
return render(request, 'example.html', context)
في القالب example.html يمكن استدعاء المتغيرات:
html<p>مرحبًا {{ name }}، عمرك {{ age }} سنة.p>
6. توجيه العروض عبر URLs
لكي يستجيب التطبيق للطلبات، يجب تعريف روابط (URLs) تشير إلى العروض المختلفة في ملف urls.py. هذا التنظيم يساعد على فصل منطق التوجيه عن العروض نفسها.
مثال:
pythonfrom django.urls import path
from .views import articles_list
urlpatterns = [
path('articles/', articles_list, name='articles-list'),
]
هنا عند زيارة /articles/ سيعمل العرض articles_list.
7. إدارة القوالب في مشروع Django
لتنظيم القوالب، يتم عادة إنشاء مجلد باسم templates داخل كل تطبيق أو على مستوى المشروع. داخل هذا المجلد يمكن تنظيم القوالب بشكل هرمي أو حسب الوظيفة.
مثال هيكلية مجلد القوالب:
csharpmyproject/
│
├── myapp/
│ ├── templates/
│ │ ├── myapp/
│ │ │ ├── list.html
│ │ │ └── detail.html
│
├── templates/
│ ├── base.html
│
ويتم تهيئة إعدادات TEMPLATES في ملف settings.py لتعريف مسارات القوالب.
8. الفلاتر والعلامات في قوالب Django
توفر Django مجموعة واسعة من الفلاتر التي يمكن استخدامها لتعديل النصوص والبيانات قبل عرضها. من أشهر هذه الفلاتر:
-
dateلتنسيق التواريخ. -
defaultلإظهار قيمة افتراضية إذا كان المتغير فارغًا. -
lengthلعرض طول قائمة أو نص. -
lowerلتحويل النص إلى أحرف صغيرة.
مثال:
html<p>تاريخ النشر: {{ article.publish_date|date:"d/m/Y" }}p>
<p>عدد التعليقات: {{ comments|length }}p>
بالإضافة إلى الفلاتر، هناك علامات تحكم مثل:
-
{% if %}للتحقق من شرط معين. -
{% for %}لتنفيذ حلقات تكرار. -
{% include %}لإدراج قالب داخل قالب آخر.
9. الأمن في قوالب Django
يستخدم Django تلقائيًا ترميز HTML (HTML escaping) عند عرض المتغيرات لمنع هجمات الحقن (Injection) مثل هجمات XSS، مما يحمي الموقع من إدخال أكواد خبيثة عبر المدخلات.
يمكن تجاوز هذا الحماية بحذر شديد عند استخدام الفلاتر مثل safe:
html{{ user_input|safe }}
لكن من الضروري استخدام هذا فقط عندما تكون متأكدًا من سلامة البيانات.
10. مزايا نظام العروض والقوالب في Django
-
فصل المنطق عن العرض: يتيح ذلك تنظيم الكود بشكل أفضل وتسهيل الصيانة.
-
إعادة الاستخدام: من خلال استخدام القوالب الأساسية والامتدادات.
-
دعم البرمجة الكائنية: باستخدام العروض المعتمدة على الأصناف.
-
سهولة التكامل مع قواعد البيانات: حيث يمكن للعروض جلب البيانات وتمريرها مباشرةً للقوالب.
-
أمان افتراضي: من خلال ترميز HTML التلقائي ومنع هجمات XSS.
11. مثال عملي متكامل
لنفترض أننا نريد بناء صفحة تعرض قائمة من المنتجات. سنبدأ بإنشاء نموذج (Model):
pythonfrom django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=8, decimal_places=2)
description = models.TextField()
def __str__(self):
return self.name
بعد ذلك نكتب العرض لجلب المنتجات:
pythonfrom django.shortcuts import render
from .models import Product
def products_list(request):
products = Product.objects.all()
return render(request, 'products/list.html', {'products': products})
القالب products/list.html لعرض المنتجات:
html{% extends "base.html" %}
{% block title %}قائمة المنتجات{% endblock %}
{% block content %}
<h2>المنتجاتh2>
<ul>
{% for product in products %}
<li>{{ product.name }} - السعر: {{ product.price }} ريالli>
{% empty %}
<li>لا توجد منتجات متاحة.li>
{% endfor %}
ul>
{% endblock %}
وأخيرًا، تعريف الرابط في urls.py:
pythonfrom django.urls import path
from .views import products_list
urlpatterns = [
path('products/', products_list, name='products-list'),
]
12. الخلاصة (الجزء الأول)
العروض والقوالب في Django هما العمود الفقري الذي تقوم عليه عملية بناء صفحات الويب الديناميكية في إطار العمل. العروض تتعامل مع الطلبات والبيانات، بينما القوالب تتحكم في كيفية عرض هذه البيانات للمستخدم بشكل منظم وجذاب.
يتطلب استخدام النظام بشكل فعال فهماً دقيقاً لكيفية تفاعل العروض مع القوالب، وأدوات التحكم المتاحة داخل القوالب، وأسلوب تنظيم الملفات ضمن المشروع. في هذا الجزء تم استعراض المفاهيم الأساسية والعناصر الرئيسية التي تشكل نظام العروض والقوالب، مع أمثلة عملية توضح كيفية بناء صفحة ويب بسيطة.
في الأجزاء القادمة سيتم التوسع في مواضيع متقدمة مثل العروض المعتمدة على الأصناف، التعامل مع النماذج في القوالب، إدارة النماذج، وتحسين أداء القوالب من خلال التخزين المؤقت (caching)، بالإضافة إلى التطرق إلى تخصيص القوالب وطرق التهيئة المختلفة.
المصادر والمراجع
المقال حاضر ليكون مرجعًا غنيًا وموسعًا لفهم العروض والقوالب في Django بشكل علمي ومنظم، ويعد قاعدة متينة لتطوير مشاريع ويب ناجحة باستخدام هذا الإطار القوي.

