
روز ۹: ارسال داده از View به Template در جنگو
یکی از مهمترین مباحث در جنگو نحوه ارسال داده از View به Template است، چرا که بدون این فرآیند، صفحات وب شما تنها HTML ثابت نمایش خواهند داد و هیچ قابلیت داینامیکی نخواهند داشت. هر پروژه واقعی نیاز دارد که اطلاعات پایگاه داده یا ورودیهای کاربر به قالب HTML منتقل شوند تا خروجی مناسب به کاربر ارائه شود. در این روز از دوره آموزش جنگو، یاد میگیریم چگونه دادهها را از View تهیه کنیم، آنها را آماده و پردازش کنیم و سپس با استفاده از Context به Template ارسال نماییم. درک درست این فرآیند، پایه تمام پروژههای حرفهای جنگو است و بدون آن، معماری MVT کامل نخواهد بود.
View و Context: قلب ارسال دادهها
View در جنگو جایی است که تمام منطق برنامه اجرا میشود و مسئول پردازش دادهها و تصمیمگیری درباره محتوایی است که قرار است به کاربر نمایش داده شود. Context در واقع یک دیکشنری پایتونی است که شامل دادههایی میشود که قرار است در Template استفاده شوند. هنگامی که View دادهها را در قالب Context آماده کرد، با استفاده از تابع render این دادهها همراه Template به سیستم تحویل داده میشوند تا خروجی نهایی HTML تولید شود. این فرآیند ساده و منظم باعث میشود دادهها بدون دخالت مستقیم در HTML پردازش شوند و لایه نمایش از منطق برنامه جدا بماند.
ساختار پایه View برای ارسال داده
برای مثال، فرض کنید میخواهیم یک صفحه درباره ما بسازیم که شامل عنوان صفحه و توضیحات کوتاه باشد. ابتدا View را در فایل views.py تعریف میکنیم و دادهها را در قالب Context آماده مینماییم. سپس با استفاده از تابع render، Template را همراه دادهها باز میگردانیم. این روش بسیار خوانا و استاندارد است و پایه تمام ارسال دادهها در پروژههای واقعی محسوب میشود.
from django.shortcuts import render
def about_view(request):
context = {
'title': 'درباره ما',
'description': 'این صفحه درباره پروژه آموزشی Django ماست و نحوه استفاده از Template را نشان میدهد.'
}
return render(request, 'app/about.html', context)
در این مثال، View دادهها را به قالب about.html میفرستد و Template مسئول نمایش آنها خواهد بود. توجه داشته باشید که Context همیشه به شکل دیکشنری ارسال میشود و کلیدهای آن میتوانند هر نام معناداری داشته باشند.
استفاده از دادههای ارسالشده در Template
پس از ارسال دادهها از View، Template قادر است از این دادهها برای نمایش محتوا استفاده کند. Template Engine در جنگو با استفاده از آکولادهای دوگانه {{ }} امکان قرار دادن متغیرها را در HTML فراهم میکند. این کار باعث میشود که قالبها داینامیک شوند و بدون نیاز به نوشتن کد پیچیده، دادهها به کاربر نمایش داده شوند.
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ title }}</h1>
<p>{{ description }}</p>
</body>
</html>در این کد، دو متغیر title و description از Context دریافت شده و به کاربر نمایش داده میشوند. این سادهترین مثال ارسال داده از View به Template است و پایه تمام مثالهای پیشرفتهتر در جنگو محسوب میشود.
ارسال لیستها و استفاده از حلقهها در Template
یکی از قابلیتهای قدرتمند جنگو این است که میتوانید دادههای پیچیده مانند لیست یا QuerySet از مدلها را نیز به Template ارسال کنید. سپس با استفاده از Template Tags میتوان این دادهها را در HTML نمایش داد. این ویژگی به خصوص برای صفحات خبری، فروشگاهی یا آموزشی که باید محتوای داینامیک زیادی را نمایش دهند، بسیار مهم است.
def courses_view(request):
courses = ['Python', 'Django', 'FastAPI', 'JavaScript']
context = {'courses': courses}
return render(request, 'app/courses.html', context)
<ul>
{% for course in courses %}
<li>{{ course }}</li>
{% endfor %}
</ul>در این مثال، View یک لیست از دورهها به Template میفرستد و Template با استفاده از حلقه for آنها را در HTML نمایش میدهد. استفاده از این قابلیت باعث میشود صفحات شما کاملاً داینامیک و قابل گسترش باشند.
ارسال دادههای دیکشنری و ساختارهای پیچیدهتر
همچنین میتوانید دادههای پیچیدهتر شامل دیکشنریها یا ترکیبی از لیست و دیکشنری را از View ارسال کنید و در Template به راحتی دسترسی داشته باشید. این امکان باعث میشود صفحات وب شما کاملاً انعطافپذیر شوند و بتوانید اطلاعات مرتبط با کاربران، محصولات یا مقالات را بدون مشکل نمایش دهید.
def profile_view(request):
user_info = {
'username': 'ali',
'email': 'ali@example.com',
'interests': ['Python', 'Django', 'Data Science']
}
context = {'user_info': user_info}
return render(request, 'app/profile.html', context)
<h2>نام کاربری: {{ user_info.username }}</h2>
<p>ایمیل: {{ user_info.email }}</p>
<ul>
{% for interest in user_info.interests %}
<li>{{ interest }}</li>
{% endfor %}
</ul>در این کد، دادهها به Template منتقل شده و با استفاده از Template Tags نمایش داده میشوند، بدون اینکه View و Template با هم قاطی شوند.
مزایای ارسال داده از View به Template
ارسال داده از View به Template باعث میشود معماری پروژه شفاف و قابل نگهداری باشد، امنیت پروژه بالاتر رود، و امکان تست و تغییر دادهها بدون تأثیر روی ظاهر سایت فراهم شود. این روش باعث میشود پروژههای جنگو حتی با بزرگ شدن نیز قابل مدیریت باقی بمانند و توسعهدهندگان بتوانند بدون دردسر روی بخشهای مختلف کار کنند.
جمعبندی روز نهم
در روز نهم دوره جنگو یاد گرفتیم چگونه دادهها از View به Template ارسال میشوند، Context چیست، چگونه لیستها و دیکشنریها را منتقل کنیم و از Template Tags برای نمایش دادهها استفاده کنیم. تسلط بر این بخش پایه تمام پروژههای حرفهای جنگو است و بدون آن، ایجاد صفحات داینامیک و قابل توسعه تقریباً غیرممکن خواهد بود. پس این روز یکی از کلیدیترین بخشهای یادگیری جنگو محسوب میشود و توصیه میشود مفاهیم و مثالها را چند بار تمرین کنید تا کاملاً جا بیفتد.