العروض والقوالب في Django – الجزء الثاني: تعمق شامل في آليات الربط بين الواجهة الخلفية والواجهة الأمامية
في إطار تطوير تطبيقات الويب باستخدام Django، تُعد آلية التفاعل بين العروض (Views) والقوالب (Templates) حجر الزاوية في نقل البيانات من الواجهة الخلفية إلى الواجهة الأمامية. هذا التفاعل هو ما يمنح التطبيقات ديناميكيتها وقدرتها على تخصيص المحتوى بحسب السياق والمستخدم. في الجزء الأول من الحديث عن العروض والقوالب، تم التطرق إلى البنية الأساسية للعروض ودورها في معالجة الطلبات، بالإضافة إلى التعريف بالقوالب ووظائفها في تقديم محتوى HTML ديناميكي. أما في هذا الجزء الثاني، فسيتم التعمق أكثر في كيفية تمرير البيانات من العروض إلى القوالب، وكيفية استخدام السياق (Context)، وتوظيف محركات القوالب لتوليد محتوى مخصص، مع تناول حالات متقدمة مثل تضمين القوالب، الوراثة، استخدام الفلاتر والعلامات المخصصة، والتعامل مع بيانات النماذج (Forms) عبر العروض.
أولاً: تمرير البيانات من العروض إلى القوالب
العرض في Django لا يُعد فقط وسيطًا بين الطلب والاستجابة، بل هو أيضًا مسؤول عن تجميع البيانات اللازمة للعرض وتهيئتها بطريقة يفهمها القالب. تتم عملية تمرير البيانات من العرض إلى القالب عبر كائن يُعرف بالسياق (context)، وهو ببساطة قاموس (Dictionary) يحتوي على مفاتيح وقيم.
مثال عملي على تمرير البيانات:
pythonfrom django.shortcuts import render
def home(request):
context = {
'title': 'الصفحة الرئيسية',
'user': 'أحمد',
'articles': ['مقال 1', 'مقال 2', 'مقال 3']
}
return render(request, 'home.html', context)
محتوى قالب home.html:
html<h1>{{ title }}h1>
<p>مرحبًا {{ user }}!p>
<ul>
{% for article in articles %}
<li>{{ article }}li>
{% endfor %}
ul>
في المثال السابق، يتم تمرير العنوان واسم المستخدم وقائمة المقالات إلى القالب ليتم عرضها بطريقة ديناميكية. هذا الأسلوب يُعد جوهريًا في تطبيقات الويب الحديثة التي تتطلب تخصيص الواجهة بحسب المحتوى المتاح.
ثانيًا: القوالب الموروثة (Template Inheritance)
واحدة من أقوى مزايا نظام القوالب في Django هي القدرة على الوراثة. تسمح وراثة القوالب بإنشاء بنية HTML موحدة تُستخدم في صفحات متعددة مع إمكانية تخصيص أجزاء معينة منها.
قالب أساسي base.html:
htmlhtml>
<html>
<head>
<title>{% block title %}عنوان افتراضي{% endblock %}title>
head>
<body>
<header>{% block header %}رأس الصفحة{% endblock %}header>
<main>{% block content %}{% endblock %}main>
<footer>{% block footer %}حقوق النشر{% endblock %}footer>
body>
html>
قالب فرعي about.html:
html{% extends 'base.html' %}
{% block title %}من نحن{% endblock %}
{% block content %}
<h2>حول الموقعh2>
<p>هذا هو وصفنا...p>
{% endblock %}
من خلال هذا النموذج، يمكن لتطبيق الويب الحفاظ على تنسيق موحد بين الصفحات المختلفة، وتسهيل صيانة الكود وإعادة استخدامه.
ثالثًا: استخدام الفلاتر (Filters) والعلامات (Tags) في القوالب
نظام القوالب في Django يتيح استخدام ما يُعرف بالفلاتر والعلامات لتعديل البيانات المعروضة.
أمثلة على الفلاتر:
html<p>{{ username|upper }}p>
<p>{{ description|truncatewords:10 }}p>
<p>{{ date_joined|date:"d M Y" }}p>
أمثلة على العلامات:
html{% if user.is_authenticated %}
<p>مرحبًا، {{ user.username }}p>
{% else %}
<p>الرجاء تسجيل الدخولp>
{% endif %}
فلاتر مخصصة:
يمكن أيضًا إنشاء فلاتر مخصصة باستخدام Python وتسجيلها عبر ملف templatetags.
مثال على فلتر مخصص:
python# myapp/templatetags/custom_filters.py
from django import template
register = template.Library()
@register.filter
def reverse_str(value):
return value[::-1]
ثم يتم استخدامه في القالب كالتالي:
html<p>{{ "Django"|reverse_str }}p>
رابعًا: تضمين القوالب (Template Inclusion)
يمكن تضمين قوالب فرعية ضمن قوالب أخرى باستخدام {% include %}، وهي طريقة فعالة لتقسيم واجهة المستخدم إلى أجزاء قابلة لإعادة الاستخدام مثل القوائم الجانبية، رؤوس الصفحات، أو تذييلاتها.
html{% include "partials/navbar.html" %} {% include "partials/sidebar.html" %}
هذا النهج يسهم في تنظيم المشروع وتقليل التكرار في الكود.
خامسًا: إدارة النماذج (Forms) باستخدام العروض والقوالب
في سياقات أكثر تعقيدًا، مثل التعامل مع النماذج، يكون للعروض دور مركزي في التحقق من صحة البيانات، وحفظها في قاعدة البيانات، ثم إعادة توجيه المستخدم أو عرض الرسائل المناسبة.
مثال على عرض يعالج نموذج:
pythonfrom django.shortcuts import render, redirect
from .forms import ContactForm
def contact_view(request):
if request.method == 'POST':
form = ContactForm(request.POST)
if form.is_valid():
form.save()
return redirect('success')
else:
form = ContactForm()
return render(request, 'contact.html', {'form': form})
القالب contact.html:
html<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">إرسالbutton>
form>
هذا الأسلوب يعزز من أمان التطبيق ومرونته، حيث يتم عزل منطق التحقق من الصحة في العرض، بينما تُعنى القوالب بالعرض فقط دون تنفيذ أي منطق برمجي.
سادسًا: بناء صفحات ديناميكية باستخدام حلقات وشروط متقدمة
لإنشاء واجهات تفاعلية وغنية بالمعلومات، يمكن استخدام الحلقات والشروط المعقدة داخل القوالب لعرض عناصر متعددة بطريقة ديناميكية.
مثال عملي:
html<table>
<tr>
<th>اسم الطالبth>
<th>الدرجةth>
<th>التقييمth>
tr>
{% for student in students %}
<tr>
<td>{{ student.name }}td>
<td>{{ student.grade }}td>
<td>
{% if student.grade >= 90 %}
ممتاز
{% elif student.grade >= 75 %}
جيد جدًا
{% elif student.grade >= 60 %}
جيد
{% else %}
ضعيف
{% endif %}
td>
tr>
{% endfor %}
table>
سابعًا: الجدولة واستخدام الجداول في عرض البيانات
عند الحاجة لعرض بيانات منظمة – مثل الجداول الزمنية، درجات الطلاب، أو المنتجات – فإن استعمال الجداول في القوالب يُعد خيارًا مثاليًا.
جدول نموذجي لعرض بيانات المستخدمين:
| الاسم | البريد الإلكتروني | آخر تسجيل دخول | الحالة |
|---|---|---|---|
| أحمد علي | [email protected] | 2025-06-01 12:43 | نشط |
| سارة حسين | [email protected] | 2025-05-30 17:28 | غير نشط |
| محمد ناصر | [email protected] | 2025-06-07 10:05 | نشط |
يتم بناء مثل هذا الجدول بسهولة داخل القوالب باستخدام حلقات {% for %}، ويتم تمرير البيانات من العرض كقائمة من القواميس أو كاستعلام QuerySet.
ثامنًا: التعامل مع القوالب المتقدمة والمشروطة
في بعض الحالات، قد يتطلب الأمر عرض قوالب مختلفة بناءً على الشرط أو نوع المستخدم أو الجهاز. يُمكن إنجاز ذلك داخل العروض أو القوالب باستخدام الشروط أو تخصيص العرض بناءً على نوع الطلب.
مثال على اختيار القالب داخل العرض:
pythondef dashboard(request):
if request.user.is_staff:
template = 'admin_dashboard.html'
else:
template = 'user_dashboard.html'
return render(request, template)
تاسعًا: تحسين أداء القوالب باستخدام التخزين المؤقت (Template Caching)
لتحسين الأداء وتقليل زمن الاستجابة، يمكن استخدام التخزين المؤقت للقوالب أو أجزاء منها باستخدام أدوات مثل cache tag:
html{% load cache %} {% cache 300 sidebar %} {% endcache %}
هذا الأسلوب يحسن من أداء الموقع خاصةً في المواقع ذات عدد زيارات مرتفع.
عاشرًا: التعامل مع ملفات الاستايل والصور داخل القوالب
القوالب لا تقتصر على HTML فحسب، بل يمكنها أيضًا استدعاء ملفات CSS وJavaScript باستخدام وسوم ثابتة (static tag).
html{% load static %}
<link rel="stylesheet" href="{% static 'css/styles.css' %}">
<img src="{% static 'images/logo.png' %}" alt="الشعار">
يجب التأكد من إعداد STATIC_URL وSTATICFILES_DIRS في إعدادات المشروع لتمكين هذا الاستخدام بشكل صحيح.
المصادر والمراجع
-
Django Documentation. Templates. https://docs.djangoproject.com/en/stable/topics/templates/
-
Django Documentation. Views and URLconfs. https://docs.djangoproject.com/en/stable/topics/http/views/
هذا المقال يمثل جزءًا متقدمًا من سلسلة العروض والقوالب في Django، ويهدف إلى تقديم فهم معمق للأدوات المتاحة لتوليد محتوى ويب ديناميكي منظم، قابل للتطوير وسهل الصيانة.

