فصل 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) سه چیز را می‌گیرد:

  1. request آبجکت
  2. مسیر تمپلیت HTML
  3. یک دیکشنری از داده‌ها (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 به تمپلیت.
محمد وب‌سایت

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *