فصل 5: تعریف URLها (URL Patterns)

URL چیست؟
URL (Uniform Resource Locator) آدرسی است که شما در مرورگر تایپ میکنید تا به یک صفحه خاص در وبسایت دسترسی پیدا کنید. در جنگو، شما مشخص میکنید که هر URL باید به کدام View (همان کد پایتون) متصل شود.
urlpatterns کجاست؟
هر پروژه و هر اپلیکیشن در جنگو یک فایل urls.py دارد. این فایل وظیفه “نقشهبرداری” URLها به Viewها را بر عهده دارد.
فایل urls.py پروژه (پوشه اصلی پروژه شما):
در ریشه پروژه، فایل urls.py اصلی وجود دارد. این فایل مثل یک راهنمای اصلی است که ترافیک ورودی را به urls.pyهای مربوط به هر اپلیکیشن هدایت میکند.
مثال:
# myproject/myproject/urls.py
from django.contrib import admin
from django.urls import path, include # `include` رو اضافه میکنیم
urlpatterns = [
path('admin/', admin.site.urls),
path('blog/', include('blog.urls')), # ترافیک 'blog/' رو بفرست به فایل urls.py اپلیکیشن blog
path('', include('myapp.urls')), # ترافیک ریشه (صفحه اصلی) رو بفرست به urls.py اپلیکیشن myapp
]
توضیح:
path('admin/', admin.site.urls): آدرسadmin/را به پنل مدیریت جنگو وصل میکند.path('blog/', include('blog.urls')): هر آدرسی که باblog/شروع میشود را به فایلurls.pyداخل اپلیکیشنblogمیفرستد.path('', include('myapp.urls')): آدرس ریشه سایت (صفحه اصلی) را به فایلurls.pyداخل اپلیکیشنmyappمیفرستد.
فایل urls.py اپلیکیشن (پوشه اپلیکیشن شما):
حالا در داخل هر اپلیکیشن، مثلاً myapp، باید یک فایل urls.py بسازید و آدرسهای مربوط به آن اپلیکیشن را تعریف کنید.
مثال:
# myapp/urls.py
from django.urls import path
from . import views # views های اپلیکیشن رو وارد میکنیم
urlpatterns = [
path('', views.home, name='home'), # آدرس ریشه اپلیکیشن (مثلا /) به تابع home در views.py وصل میشود.
path('about/', views.about, name='about'), # آدرس /about به تابع about در views.py وصل میشود.
path('contact/', views.contact, name='contact'), # آدرس /contact به تابع contact در views.py وصل میشود.
path('post/<int:post_id>/', views.post_detail, name='post_detail'), # آدرس دینامیک
]
توضیح:
path('', views.home, name='home'): وقتی کاربر به آدرس اصلی اپلیکیشن (مثلاًhttp://127.0.0.1:8000/اگر اپلیکیشن اصلی باشد یاhttp://127.0.0.1:8000/blog/اگر درblogباشید) میرود، تابعhomeدرviews.pyاجرا میشود.name='home'یک نام برای این URL تعریف میکند که بعداً در تمپلیتها میتوانیم از آن استفاده کنیم.path('post/<int:post_id>/', views.post_detail, name='post_detail'): این یک URL دینامیک است.<int:post_id>به جنگو میگوید که هر عددی در این بخش از آدرس (/post/1/,/post/25/و …) را بگیرد و به عنوان پارامترpost_idبه تابعpost_detailدرviews.pyبفرستد.
بخش ۲: ساخت Viewهای ساده (Simple Views)
View چیست؟
View (نما) یک تابع پایتون است که منطق اصلی پشت هر صفحه وبسایت شما را اجرا میکند. این توابع درخواست کاربر را دریافت میکنند، اطلاعات لازم را از دیتابیس (با استفاده از مدلها) میگیرند و یک پاسخ (معمولاً یک صفحه HTML) را به مرورگر کاربر برمیگردانند.
مکان Viewها:
Viewها معمولاً در فایل views.py داخل هر اپلیکیشن تعریف میشوند.
مثال ساخت Viewهای ساده در myapp/views.py:
# myapp/views.py
from django.shortcuts import render
from django.http import HttpResponse # برای برگرداندن پاسخهای متنی ساده
def home(request):
"""
این View صفحه اصلی وبسایت را نمایش میدهد.
"""
return HttpResponse("<h1>به صفحه اصلی خوش آمدید!</h1>")
def about(request):
"""
این View صفحه درباره ما را نمایش میدهد.
"""
return HttpResponse("<h1>درباره ما: ما اینجا هستیم تا جنگو را آموزش دهیم.</h1>")
def contact(request):
"""
این View صفحه تماس با ما را نمایش میدهد.
"""
return HttpResponse("<h1>تماس با ما: با ایمیل info@example.com در ارتباط باشید.</h1>")
def post_detail(request, post_id):
"""
این View جزئیات یک پست خاص را نمایش میدهد.
post_id از URL به عنوان پارامتر به این تابع ارسال میشود.
"""
return HttpResponse(f"<h1>جزئیات پست شماره {post_id}</h1>")
توضیح:
- هر View یک تابع پایتون است.
- پارامتر
requestهمیشه باید اولین پارامتر یک View باشد. این آبجکت شامل اطلاعاتی درباره درخواست کاربر (مثلاً چه کسی درخواست داده، چه دادههایی فرستاده و …) است. HttpResponseبرای برگرداندن یک پاسخ متنی ساده به مرورگر استفاده میشود. در عمل، ما بیشتر ازrender(که در بخش بعدی توضیح میدهیم) برای نمایش تمپلیتهای HTML استفاده میکنیم.- در
post_detail، پارامترpost_idکه از URL گرفته شده بود، به تابع View ارسال میشود و میتوانیم از آن در منطق View استفاده کنیم.
بخش ۳: ارسال داده از View به Template
تا الان دیدیم که چطور با HttpResponse یک متن ساده برگردانیم. اما معمولاً میخواهیم یک صفحه HTML کامل با دادههای دینامیک نمایش دهیم. اینجا render وارد میشود!
render چیست؟
تابع render (از django.shortcuts) سه چیز را میگیرد:
requestآبجکت- مسیر تمپلیت HTML
- یک دیکشنری از دادهها (Context) که میخواهید به تمپلیت بفرستید.
مثال: استفاده از render و ارسال داده به تمپلیت
ابتدا باید یک پوشه templates در داخل اپلیکیشن خود (myapp/templates/) بسازید و فایلهای HTML خود را در آن قرار دهید.
۱. فایل تمپلیت myapp/templates/home.html را بسازید:
<!DOCTYPE html>
<html lang="fa" dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ greeting }}</h1>
<p>این یک صفحه از {{ app_name }} است.</p>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
توضیح:
{{ title }}،{{ greeting }}،{{ app_name }}: اینها “متغیرها” هستند. جنگو مقدار آنها را از دیکشنری که View ارسال میکند، پر میکند.{% for item in items %}و{% endfor %}: اینها “تگهای تمپلیت” هستند که برای منطقهای ساده (مثل حلقهها) استفاده میشوند.
۲. View را در myapp/views.py تغییر دهید:
# myapp/views.py
from django.shortcuts import render
def home(request):
context = {
'title': 'صفحه اصلی من',
'greeting': 'سلام به دنیای جنگو!',
'app_name': 'وبلاگ من',
'items': ['جنگو', 'پایتون', 'وبلاگ', 'آموزش'],
}
return render(request, 'home.html', context)
def about(request):
return render(request, 'about.html') # اگر تمپلیت about.html دادهای نیاز ندارد.
توضیح:
- ما یک دیکشنری به نام
contextتعریف کردیم که شامل دادههایی است که میخواهیم به تمپلیت بفرستیم. render(request, 'home.html', context)به جنگو میگوید که فایلhome.htmlرا پیدا کند، دادههای موجود درcontextرا در آن پر کند و نتیجه نهایی HTML را به کاربر برگرداند.
جمعبندی سریع
- URLها (
urls.py): آدرسهای وبسایت شما را به توابع پایتون (Viewها) مرتبط میکنند. هم در سطح پروژه و هم در سطح اپلیکیشن. - Viewها (
views.py): توابع پایتون هستند که منطق پردازش درخواست کاربر را اجرا میکنند و یک پاسخ (معمولاً HTML) را برمیگردانند. render: تابعی است برای نمایش تمپلیتهای HTML و ارسال داده از View به تمپلیت.