من الممكن إرسال HTML إلى متصفح الويب في جانغو مباشرةً من ملف view.py. و لكن من الأفضل التعامل مع HTML في Django من خلال استخدام القوالب.
قالب جانغو ببساطة هو ملف HTML مخزّن في موقع محدد وله القدرة على إخراج المتغيرات الديناميكية والمحتوى. بدلاً من إنشاء HTML في ملف view.py، يمكننا إنشاء قوالب Django التي تحتوي على عناصر بديلة حيث سيتم عرض المتغيرات الديناميكية. من أجل استخدام القوالب في جانغو، نحتاج إلى التأكد من تسجيلها بشكل صحيح.
مسار قالب جانغو
إذن أنت جاهز لإنشاء قالب جديد لمشروع Django الخاص بك. التقليد في جانغو هو وضع القالب في مجلد التطبيق الخاص بك، ثم في داخل المجلد قم بإنشاء مجلد يسمى templates.
ثم داخل مجلد القوالب، قم بإنشاء مجلد آخر يحمل نفس اسم التطبيق. بعد ذلك سيكون دليل القالب عبارة عن goals/templates/goals.
إنشاء قالب
لإنشاء قالب، يمكننا إضافة ملف HTML إلى دليل goals/templates/goals. دعونا نسمي هذا الملف goal.html.
دعونا الآن نضيف بعض العلامات الأساسية إلى القالب. وقبل ذلك ولتسهيل عمبية التطوير في VS Code، يوجد ملحق مدمج اسمه Emmet يمكنه مساعدتك في الكتابة بفضل الاقتراحات السريعة.
اضغط على مفتاح Tab، ومن المفترض أن يحتوي قالب HTML الخاص بك الآن على بعض العلامات الأساسية. لاحظ أننا أضفنا علامة H1 مع بعض النصوص أيضًا.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>The Template Works!</h1>
</body>
</html>
تسجيل قالب جانغو
إذا حاولنا عرض هذا القالب عبر دالة العرض، فلن يعمل معنا وسنرى خطأ مثل هذا:
TemplateDoesNotExist at /goals/daily
goals/goal.html
Request Method: GET
Request URL: http://127.0.0.1:8000/goals/daily
Django Version: 3.2.4
Exception Type: TemplateDoesNotExist
Exception Value:
goals/goal.html
و من أجل استخدام القوالب الخاصة بنا، يجب علينا تسجيلها في Django. و لتسجيل القوالب في جانغو، يمكننا فتح ملف settings.py والعثور على الإعدادات المتعلقة بالقوالب.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
يتم استخدام مفتاح DIRS
الموجود في الكود السابق لإخبار Django بمسارات الدليل التي يجب البحث فيها عن ملفات قالب HTML. ويساعدنا جانغو في هذا الصدد من خلال توفير متغير BASE_DIR
في أعلى ملف settings.py.
BASE_DIR = Path(__file__).resolve().parent.parent
باستخدام هذا المتغير، يمكننا الآن إعداد DIRS
كما هو موضح أدناه لجعل Django على علم بدليل القوالب في تطبيقنا.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
BASE_DIR / 'goals' / 'templates'
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
إرسال القالب إلى HttpResponse
حالة الاستخدام للقالب هي أن يتم إرسال HTML الخاص بهذا القالب مرة أخرى إلى المستخدم عند تشغيل دالة عرض معينة. و للقيام بذلك، يجب تحويل القالب إلى سلسلة HTML التي يمكن إرسالها مرة أخرى مع الرد على المستخدم.
يمكننا استخدام دالة render_to_string()
و التي يجب استيرادها داخل ملف view.py الخاص بنا بهذه الطريقة:
from django.shortcuts import redirect, render
from django.http import HttpResponse, HttpResponseRedirect
from django.urls import reverse
from django.template.loader import render_to_string
يمكننا الآن استخدام دالة render_to_string()
في أي دالة من دوال العرض لدينا، وتمريرها إلى مسار القالب الذي نريد عرضه.
def goals_by_timeframe(request, timeframe):
goal = goals[timeframe]
response_data = render_to_string('goals/goal.html')
return HttpResponse(response_data)
يعرض الكود السابق القالب الخاص بنا إلى سلسلة HTML ويخزنه في متغير Response_data
. عند هذه النقطة، نعيد HttpResponse
مع المتغير Response_data
. ثم إذا قمنا بزيارة عنوان URL المناسب لتشغيل دالة العرض، فسنرى أن القالب معروض بشكل صحيح في متصفح الويب.
أفضل طريقة لتسجيل القوالب
لقد تمكنا من تسجيل القالب والعمل مع مشروع Django الخاص بنا، ولكن هناك طريقة أفضل للقيام بذلك. فعند تعيين مفتاح APP_DIRS
على True
يعني أن جانغو سيبحث داخل أدلة التطبيق بشكل افتراضي للعثور على ملفات القالب.
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
قد يتساءل شخص لماذا فشل Django في العثور على القالب الذي أنشأناه في محاولتنا الأولى؟ والسبب هو أنه حتى هذه اللحظة، لم نسجل تطبيقنا كجزء من INSTALLED_APPS
في settings.py.
و لذلك فعندما تريد أن يصبح أحد التطبيقات التي تقوم بإنشائها جزءًا من مشروع Django، يجب عليك تسجيله في INSTALLED_APPS
. و هذا يجعل جانغو على علم بالقوالب الموجودة في هذا التطبيق.
INSTALLED_APPS = [
'goals',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
مع هذا التغيير، يستمر القالب الخاص بنا في العمل، وكل ما كان علينا فعله هو إضافة اسم التطبيق إلى INSTALLED_APPS
حتى تسهل عملية تسجيل أي قالب لهذا التطبيق مع Django. بالنسبة للقوالب الخاصة بالتطبيقات، هذا هو الطريق المناسب. ما عليك سوى ترك APP_DIRS
مضبوطًا على True
، وإضافة اسم التطبيق إلى INSTALLED_APPS
. و تعتبر هذه الطريقة أفضل الممارسات التي تحافظ على إعداداتك نظيفة وقابلة للصيانة.
اكتشاف المزيد من بايثون العربي
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.