JavaRush /Курси /Модуль 3: Django /Обробка параметрів в URL

Обробка параметрів в URL

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

Прийшов час детально розібратися, як працювати з параметрами в URL, витягувати їх і використовувати у представленнях.

1. Витягування параметрів з URL

Отже, уяви, що ти створюєш сайт інтернет-магазину. Тобі потрібно обробити URL, де користувач може запитати сторінку конкретного товару, наприклад:

/product/42/

Де 42 — це ID товару. Для того щоб це реалізувати, Django дозволяє витягувати параметри з URL і передавати їх у представлення. Давай подивимось, як це працює.

1.1 Робота з параметрами в функції path()

Щоб налаштувати маршрут з параметрами, використовуємо синтаксис <тип_даних:ім'я_параметра> у функції path(). Розглянемо приклад:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('product/<int:product_id>/', views.product_detail, name='product-detail'),
]

Тут ми вказали, що частина URL після /product/ буде числом int, і це число має передаватися представленню з ім'ям product_detail як аргумент product_id.

1.2 Обробка параметрів у представленні

Тепер ми повинні оновити наше представлення, щоб працювати з цим параметром:

# views.py
from django.http import HttpResponse

def product_detail(request, product_id):
    # Обробка параметра product_id
    return HttpResponse(f"Відображення інформації про продукт з ID: {product_id}")

Коли користувач відкриє /product/42/, Django автоматично передасть значення 42 в аргумент product_id твого представлення. Це просто як дві строчки коду, але вже дозволяє працювати з динамічними URL!

2. Типи параметрів у маршрутах

Django дозволяє використовувати кілька типів даних у маршрутах, щоб перевіряти та інтерпретувати параметри. Основні з них:

Тип Опис Приклад URL Приклад маршруту
<int> Ціле число /product/42/ path('product/<int:id>/', ...)
<str> Рядок, що виключає / /user/johndoe/ path('user/<str:username>/', ...)
<slug> Рядок, що складається з букв, цифр, - і _ /post/my-post/ path('post/<slug:slug>/', ...)
<uuid> UUID (універсальний унікальний ідентифікатор) /resource/123e4567-e89b-12d3-a456-426614174000/ path('resource/<uuid:id>/', ...)
<path> Вміст URL, включаючи / /files/my_folder/file/ path('files/<path:file_path>/', ...)

Ви можете комбінувати параметри та використовувати їх в одному URL. Наприклад:

path('blog/<int:year>/<str:slug>/', views.blog_post, name='blog-post'),

3. Передача параметрів між маршрутами

Часто параметри потрібні для взаємодії між сторінками. Уявіть, що ви хочете створити посилання з однієї сторінки на іншу, передаючи параметри через URL.

3.1 Генерація URL з параметрами

Для цього використовуємо функцію reverse() або тег url у шаблоні.

Приклад з reverse():

from django.urls import reverse
from django.http import HttpResponseRedirect

def redirect_to_product(request, product_id):
    # Генерація URL з використанням reverse
    url = reverse('product-detail', args=[product_id])
    return HttpResponseRedirect(url)

Приклад у шаблоні:

<a href="{% url 'product-detail' product_id=42 %}">Перейти до продукту</a>

Django сам підставляє значення параметрів у маршрут, тож ви можете бути впевнені, що не помилилися у синтаксисі.

4. Обробка GET-параметрів

GET-параметри передаються в URL після знака ?. Наприклад:

/search/?q=django&page=2

У Django вони доступні через об'єкт request.GET, який працює як словник. Давай розберемо приклад:

4.1 Представлення з обробкою GET-параметрів

# views.py
def search(request):
    query = request.GET.get('q', '')  # Значення параметра "q" або порожній рядок, якщо параметра немає
    page = request.GET.get('page', 1)  # Значення параметра "page" або 1 за замовчуванням
    return HttpResponse(f"Пошук: {query}, сторінка: {page}")

Тепер, якщо ти відкриєш /search/?q=django&page=2, на екрані ти побачиш:

Пошук: django, сторінка: 2

4.2 Приклад використання GET-параметрів у шаблоні

Передача GET-параметрів теж проста. Наприклад:

<a href="/search/?q=django&page=3">Наступна сторінка</a>

Django не обробляє GET-параметри в маршрутах, оскільки вони не є частиною шляху. Це треба враховувати при проєктуванні.

5. Потенційні помилки та їх обробка

Працюючи з параметрами в URL, можна зіткнутися з кількома типовими помилками. Наприклад:

5.1 Помилка невідповідності типу

Якщо користувач введе /product/abc/ замість /product/42/, Django автоматично видасть помилку 404 через невідповідність типу параметра. Це зручно, оскільки ви можете бути впевнені, що у ваше представлення потрапить тільки коректний параметр.

5.2 Обробка відсутності параметрів

Якщо параметри не обов'язкові, то краще передбачити значення за замовчуванням:

def product_detail(request, product_id=None):
    if not product_id:
        return HttpResponse("ID продукту не вказано")
    return HttpResponse(f"Продукт з ID: {product_id}")

6. Практичне завдання

Давай застосуємо знання на практиці та створимо невеликий функціонал.

Задача: список постів і детальна сторінка

  1. Створіть маршрути:

    • /posts/ — перегляд усіх постів.
    • /posts/<int:post_id>/ — перегляд конкретного поста.
  2. Реалізуйте представлення:

    • posts_list — повертає рядок "Список постів".
    • post_detail — повертає рядок "Перегляд поста з ID: <post_id>".
  3. Оновіть urls.py:

    urlpatterns = [
        path('posts/', views.posts_list, name='posts-list'),
        path('posts/<int:post_id>/', views.post_detail, name='post-detail'),
    ]
    
  4. Додайте посилання між сторінками:

    • У /posts/ зробіть посилання на /posts/<post_id>/.

Підказка для views.py:

from django.shortcuts import render
from django.http import HttpResponse

def posts_list(request):
    html = '<a href="/posts/1/">Пост 1</a><br><a href="/posts/2/">Пост 2</a>'
    return HttpResponse(f"Список постів:
{html}") def post_detail(request, post_id): return HttpResponse(f"Перегляд поста з ID {post_id}")

Тепер ваш маршрутизований функціонал буде готовий до будь-яких викликів! Складні URL, запити та змінні більше не стануть перешкодою.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ