JavaRush /Курси /Модуль 3: Django /Зв'язування URL з представленнями у Django

Зв'язування URL з представленнями у Django

Модуль 3: Django
Рівень 3 , Лекція 3
Відкрита

Короткий зміст попередніх лекцій

До цього моменту ви познайомилися з основами роботи з представленнями (views) у Django. Ми обговорили, що таке представлення, їх роль в обробці HTTP-запитів і відмінності між функціональними (FBV) і класовими представленнями (CBV). Ви навчилися створювати прості функції представлень, повертати текстові або HTML-відповіді, а також обробляти помилки за допомогою HTTP-статус-кодів.

Ми плавно підійшли до важливої частини роботи будь-якого веб-додатку — маршрутизації. До сьогоднішнього дня ви дізналися, що таке URLConf і як він допомагає зв'язувати запити з відповідними обробниками (представленнями). Тепер ми заглибимося в процес зв'язування URL-адрес з нашими представленнями.

Чому це важливо?

Коли користувач вашої веб-сторінки натискає на посилання або вводить URL у браузері, Django має зрозуміти, яке представлення йому потрібно викликати, щоб обробити запит. Процес маршрутизації допомагає "перекласти" URL у конкретну функцію або клас, який обробить запит. Це як поштова служба: URL — це адреса, а представлення — це поштовий ящик, куди доставляють лист (запит).

Основи зв'язування URL з представленнями

У Django маршрути конфігуруються через файл urls.py. Існує головний файл маршрутів, зазвичай розташований у корені проєкту, і окремі файли urls.py у додатках, які додають свої маршрути. Наше завдання — співставити кожну URL-адресу з певним представленням.

Приблизний процес:

  1. Задаємо шаблон URL.
  2. Прив'язуємо шаблон до функції або класу представлення.
  3. Визначаємо всі маршрути у urlpatterns.

Приклад головного файлу маршрутів project/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls')),  # Підключаємо маршрути додатка "blog"
]

Приклад файлу маршрутів для додатка blog/urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),  # Головна сторінка
    path('about/', views.about, name='about'),  # Сторінка "Про нас"
]

Простий приклад маршруту

Якщо ви хочете, щоб URL /hello/ відображав повідомлення "Привіт, світе!", структура буде виглядати так:

  1. Створюємо представлення.
  2. Задаємо маршрут для URL.

Код у views.py:

from django.http import HttpResponse

def hello_world(request):
    return HttpResponse("Привіт, світе!")

Код у urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('hello/', views.hello_world, name='hello_world'),
]

Тепер, якщо ви відкриєте у браузері http://127.0.0.1:8000/hello/, ви побачите привітання.

Використання функції path()

Основний синтаксис

Функція path() — це основний інструмент для маршрутизації запитів у Django. Її синтаксис:

path(route, view, kwargs=None, name=None)
  • route — рядок, який описує шаблон URL.
  • view — посилання на функцію або клас представлення.
  • kwargs — додаткові параметри, які можна передати в представлення (рідше використовується).
  • name — ім'я маршруту. Воно дозволяє посилатися на маршрут через шаблони або зворотній виклик.

Приклад:

path('home/', views.homepage, name='homepage')

Призначення імен маршрутам

Імена маршрутів — це потужний інструмент, що дозволяє посилатися на URL-и у шаблонах і коді без жорсткого зазначення рядків. Це зручно, бо якщо ви зміните URL, вам не доведеться оновлювати шаблони чи інші частини коду.

Шаблонний приклад в HTML:

<a href="{% url 'homepage' %}">Головна сторінка</a>

Якщо пізніше маршрут буде переписаний на:

path('start/', views.homepage, name='homepage')

Посилання у шаблоні автоматично оновиться.

Приклади зв’язаних маршрутів

Обробка запитів GET і POST

До цього ми використовували тільки метод GET, але Django дозволяє обробляти й інші HTTP-методи, такі як POST. Ось приклад:

Код у views.py:

from django.http import HttpResponse

def my_view(request):
    if request.method == 'GET':
        return HttpResponse("Це GET-запит.")
    elif request.method == 'POST':
        return HttpResponse("Це POST-запит.")
    else:
        return HttpResponse("Метод не підтримується.")

Код у urls.py:

from django.urls import path
from . import views

urlpatterns = [
    path('example/', views.my_view, name='example'),
]

Тепер, якщо відправити запит GET на /example/, ви отримаєте "Це GET-запит". Якщо відправити POST, результат зміниться на "Це POST-запит".

Динамічні маршрути

Іноді потрібно приймати параметри з URL і використовувати їх у представленнях. Наприклад, якщо ви хочете відображати профіль користувача за його ID.

Код маршруту зі змінною:

path('profile/<int:user_id>/', views.user_profile, name='user_profile')

Код у представленні views.py:

from django.http import HttpResponse

def user_profile(request, user_id):
    return HttpResponse(f"Профіль користувача з ID: {user_id}")

Якщо ви відкриєте /profile/42/, ви побачите: "Профіль користувача з ID: 42".

Типи змінних:

  • <int:var> — Тільки цілочисельні значення.
  • <str:var> — Будь-який рядок.
  • <slug:var> — URL-friendly рядок (літери, цифри, дефіси).
  • <uuid:var> — UUID.
  • <path:var> — Рядок, що включає /.

Робота з urls.py у додатках

Як вже обговорювалося, кожному додатку в Django відповідає власний файл urls.py. Це дозволяє модульно проєктувати маршрути.

  1. У project/urls.py підключаємо маршрути додатку:
    from django.urls import path, include
    
    urlpatterns = [
        path('blog/', include('blog.urls')),
        ]
  1. У blog/urls.py визначаємо маршрути:
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('<int:post_id>/', views.detail, name='detail'),
        ]

Тепер:

  • http://127.0.0.1:8000/blog/ викличе views.index.
  • http://127.0.0.1:8000/blog/42/ викличе views.detail(42).

Проблеми та типові помилки

Плутанина в синтаксисі

Одна з найпоширеніших помилок — забути додати слеш в кінці URL, наприклад, path('hello', views.hello_view) замість path('hello/', views.hello_view). Django строгий до цих синтаксичних деталей. Переконайтеся, що ваші URL завершені правильним синтаксисом.

Погана організація маршрутів

Якщо у вас зростає кількість маршрутів, не забудьте модулювати їх через include(). Наприклад, тримати маршрути додатків в окремих файлах.

Резюме практики

  1. Створіть просте представлення, яке повертає текст "Ласкаво просимо!".
  2. Створіть для нього маршрут /welcome/.
  3. Реалізуйте динамічний маршрут /user/<int:id>/, який виводить повідомлення з ID користувача.
  4. Спробуйте обробити GET- та POST-запити в одному маршруті.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ