آدرسدهی (Django URLs)
یوآرالها: نقشه راه سایت شما 🗺️
یوآرالها (URL patterns) مثل نقشه راهنمایی یک شهر هستن. جنگو با استفاده از این نقشه متوجه میشه که هر درخواست کاربر رو به کدوم ویو بفرسته. بدون یوآرالها، جنگو نمیدونه وقتی کاربر به /about/ میره، باید چه ویویی رو صدا بزنه!
ساختار یوآرالها
یوآرالها در فایل urls.py تعریف میشن. بیایید ببینیم چطور:
# mysite/urls.py (فایل اصلی پروژه)
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), # پنل مدیریت جنگو
path('', include('blog.urls')), # شامل کردن یوآرالهای اپلیکیشن blog
]
یوآرالهای اپلیکیشن
هر اپلیکیشن میتونه یوآرالهای خودش رو داشته باشه:
# blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'), # صفحه اصلی: /
path('about/', views.about, name='about'), # درباره ما: /about/
path('contact/', views.contact, name='contact'), # تماس: /contact/
]
پارامتر name: به هر یوآرال یک نام میدیم تا بعداً بتونیم با تگ
url در تمپلیت بهش لینک بدیم. این کار باعث میشه اگه آدرس رو عوض کردیم، نیازی به تغییر همه لینکها نباشه!
یوآرالهای پویا (Dynamic URLs)
گاهی میخوایم یک پارامتر رو از URL بگیریم. مثلاً برای نمایش یک پست خاص:
# blog/urls.py
urlpatterns = [
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
path('category/<slug:category_slug>/', views.category_posts, name='category'),
]
# blog/views.py
def post_detail(request, post_id):
# post_id یک عدد صحیح است که از URL گرفته شده
return HttpResponse(f"نمایش پست شماره {post_id}")
def category_posts(request, category_slug):
# category_slug یک رشته است (مثل "python" یا "django")
return HttpResponse(f"پستهای دستهبندی: {category_slug}")
انواع Converter ها:
<int:name>: فقط اعداد صحیح<str:name>: رشته (پیشفرض)<slug:name>: رشته با حروف، اعداد، خط تیره و آندرلاین<uuid:name>: شناسه UUID<path:name>: مسیر کامل (شامل اسلشها)
نکته حرفهای: همیشه به یوآرالها
name بدید. این کار باعث میشه کدتون تمیزتر و قابل نگهداریتر بشه. همچنین از hard-coding URL ها در تمپلیتها جلوگیری میکنه.
خطای رایج: فراموش کردن کاما (,) در آخر لیست
urlpatterns باعث خطای سینتکس میشه. همچنین فراموش کردن include برای اپلیکیشنها هم مشکل سازه!
تمرینهای عملی
برای تثبیت یادگیری این درس تمرینهای زیر را حل کنید
تمرین: ساخت URL Pattern با پارامتر
Medium
سوال تمرین
🎯 تمرین عملی: یوآرال پویا
در این تمرین، یک سیستم یوآرال میسازیم که از URL پارامتر بگیره:
- یک تابع بنویسید که یک لیست از یوآرالها رو بگیره و pattern مناسب رو برگردونه
- یوآرال باید از این فرمت پیروی کنه:
/post/<id>/که id یک عدد صحیحه - همچنین یک یوآرال برای دستهبندی بسازید:
/category/<slug>/
راهنمایی: از path و converter های جنگو استفاده کنید.
پاسخ تمرین
PYTHON
from django.urls import path
def create_url_patterns():
# ساخت لیست urlpatterns
# در واقعیت، این کار در urls.py انجام میشه و views رو import میکنیم
# ولی برای تمرین، فقط pattern ها رو میسازیم
# شبیهسازی views (در واقعیت باید import بشن)
class MockViews:
@staticmethod
def home(request):
pass
@staticmethod
def post_detail(request, id):
pass
@staticmethod
def category_posts(request, slug):
pass
views = MockViews()
urlpatterns = [
path('', views.home, name='home'),
path('post/<int:id>/', views.post_detail, name='post_detail'),
path('category/<slug:slug>/', views.category_posts, name='category'),
]
return urlpatterns
# تست
if __name__ == "__main__":
patterns = create_url_patterns()
print(f"تعداد یوآرالها: {len(patterns)}")
for p in patterns:
print(f" - {p.pattern}")
آماده رفتن به درس بعدی هستید؟
این درس را به پایان رساندید و میتوانید به درس بعدی بروید.