دوره‌ها / Django / آدرس‌دهی (Django URLs)

آدرس‌دهی (Django URLs)

30 دقیقه Article

یوآرال‌ها: نقشه راه سایت شما 🗺️

یوآرال‌ها (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 پارامتر بگیره:

  1. یک تابع بنویسید که یک لیست از یوآرال‌ها رو بگیره و pattern مناسب رو برگردونه
  2. یوآرال باید از این فرمت پیروی کنه: /post/<id>/ که id یک عدد صحیحه
  3. همچنین یک یوآرال برای دسته‌بندی بسازید: /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}")

آماده رفتن به درس بعدی هستید؟

این درس را به پایان رساندید و می‌توانید به درس بعدی بروید.