ایجاد تمپلیت


همانطور که پیش‌تر اشاره شد، الگوهای آدرس (URL patterns) در جنگو، نقش یک پل را بین درخواست‌های کاربر و منطق برنامه ایفا می‌کنند. هر الگوی URL، یک آدرس وب را به یک تابع view متصل می‌کند. این تابع view، به عنوان مسئول اصلی پردازش درخواست، تصمیم می‌گیرد که چه داده‌هایی باید جمع‌آوری شوند، چگونه پردازش شوند و چه اطلاعاتی به کاربر ارائه گردد.

پس از آن، داده‌ها به یک تمپلیت (template) منتقل می‌شوند — که در واقع فایل‌های HTML هستند و نحوه نمایش بصری اطلاعات را تعیین می‌کنند. برای اینکه جنگو بتواند این تمپلیت‌ها را پیدا کند، باید دایرکتوری templates را به صورت دستی در مسیر ریشه پروژه (هم سطح فایل manage.py) و یا داخل دایرکتوری پروژه (در اینجا tutorial) ایجاد کنیم، زیرا این دایرکتوری به‌صورت پیش‌فرض وجود ندارد. ایجاد این دایرکتوری، گام اول و ضروری برای سازمان‌دهی منطق نمایشی برنامه و جداکردن لایه‌های طراحی از منطق کسب‌وکار است.

└───Tutorial-Django
    │   manage.py
    └───tutorial
        │   asgi.py
        │   settings.py
        │   urls.py
        │   wsgi.py
        │   __init__.py
        │
        └───templates

پس از ایجاد دایرکتوری templates در مسیر ریشه پروژه، باید جنگو را مطلع کنیم تا این دایرکتوری را به عنوان مکانی برای جستجوی فایل‌های تمپلیت شناسایی کند. برای این منظور، به فایل settings.py درون دایرکتوری جنگوی پروژه (هم سطح فایل‌های urls.py و wsgi.py) رفته و در بخش TEMPLATES، پارامتر DIRS:[ ] را ویرایش می‌کنیم. در این قسمت، مسیر دایرکتوری templates را به صورت مطلق (absolute path) اضافه می‌کنیم تا جنگو بتواند فایل‌های HTML ما را در هر زمانی که از آنها استفاده می‌شود، پیدا و بارگذاری کند. این تنظیم، گام ضروری برای فعال‌سازی سیستم تمپلیت‌های شخصی‌سازی‌شده در پروژه است و بدون آن، حتی اگر فایل‌های تمپلیت وجود داشته باشند، جنگو قادر به تشخیص و استفاده از آنها نخواهد بود.

tutorial/settings.py

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, 'tutorial/templates'], # 🡨 HERE
        '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',
            ],
        },
    },
]

البته دستور فوق در نسخه‌­های جدید جنگو عرضه شده و در صورت عدم کارایی می‌توان از دستور زیر نیز بهره گرفت

import os

TEMPLATES = [
        '...',
        'DIRS': [os.path.join(BASE_DIR, 'tutorial/templates'),],
        '...'
]

حال که جنگو را به درستی آموزش داده‌ایم تا دایرکتوری templates را به عنوان مکان پیش‌فرض برای فایل‌های تمپلیت شناسایی کند، می‌توانیم اولین تمپلیت خود را ایجاد کنیم. برای آدرس Home (یا همان ریشه وب‌سایت)، یک فایل با نام base.html درون دایرکتوری templates ایجاد می‌کنیم. این فایل به عنوان قالب پایه (Base Template) عمل می‌کند و ساختار اصلی صفحه — شامل هدر، فوتر، لینک‌های CSS و JavaScript، و سایر المان‌های مشترک — را تعریف می‌نماید. با استفاده از این قالب پایه، می‌توانیم در صفحات مختلف از طریق مکانیزم extends، از همان ساختار اصلی استفاده کنیم و تنها بخش‌های متغیر را جایگزین نماییم؛ این رویکرد نه تنها کدنویسی را تمیزتر و قابل نگهداری‌تر می‌کند، بلکه یکنواختی ظاهری سایت را نیز تضمین می‌نماید.

tutorial/templates/base.html

<!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> Araz.S.X </title>
</head>
<body>
  <h1> Core-App Home Page </h1>
  <p> page is rendered from <b>"tutorial/templates/base.html"</b> template </p>
</body>
</html>

حال می­‌بایست، با استفاده از قابلیت­های view نسبت به چگونگی نمایش مسیر آدرس home/ اقدام نماییم:

coreapp/views.py

from django.shortcuts import render

# Create your views here.
def homeFunc(request):
    return render(request, 'base.html')


در این­صورت نمایش صفحه در مسیر آدرس  http://127.0.0.1:8000 بدین شکل خواهد بود

Django Tutorial | Base Template

برای رعایت ساختار استاندارد و افزایش قابلیت نگهداری و تکرارپذیری پروژه، تمپلیت‌های عمومی و اساسی — مانند navbar.html, footer.html, base.html یا هر المانی که در بیشتر صفحات پروژه استفاده می‌شود — در دایرکتوری ریشه پروژه (در مسیر projectname/templates/) قرار می‌گیرند. این تمپلیت‌ها به عنوان پایه (base templates) برای سایر صفحات به کار می‌روند و از تکرار کد جلوگیری می‌کنند. در مقابل، تمپلیت‌های اختصاصی هر اپ (مانند لیست محصولات، صفحه ورود کاربر، و غیره) در زیرمجموعهٔ /appname/templates/ داخل همان اپ قرار می‌گیرند. این ساختار دوگانه، مسئولیت‌پذیری را مشخص می‌کند: تمپلیت‌های عمومی در سطح پروژه و تمپلیت‌های اپ-محور در سطح اپ. بدین منظور، همانطور که در سطح پروژه یک دایرکتوری templates/ ایجاد می‌کنیم، در هر اپ نیز یک دایرکتوریtemplates/ با همان الگوی سازمان‌یافته ایجاد می‌شود تا ساختار پروژه تمیز، مقیاس‌پذیر و مطابق با بهترین روش‌های جنگو باشد.

└───Tutorial-Django
    │   manage.py
    │
    ├───clientapp
    │   │
    │   ├───migrations
    │   └───templates
    ├───coreapp
    │   │
    │   ├───migrations
    │   └───templates
    └───tutorial
        │
        └───templates
                base.html