Прийшов час детально розібратися, як працювати з параметрами в 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. Практичне завдання
Давай застосуємо знання на практиці та створимо невеликий функціонал.
Задача: список постів і детальна сторінка
Створіть маршрути:
/posts/— перегляд усіх постів./posts/<int:post_id>/— перегляд конкретного поста.
Реалізуйте представлення:
posts_list— повертає рядок "Список постів".post_detail— повертає рядок "Перегляд поста з ID:<post_id>".
Оновіть
urls.py:urlpatterns = [ path('posts/', views.posts_list, name='posts-list'), path('posts/<int:post_id>/', views.post_detail, name='post-detail'), ]Додайте посилання між сторінками:
- У
/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, запити та змінні більше не стануть перешкодою.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ