У цій лекції ми переведемо всі накопичені знання в практику — створимо додаток із повноцінною маршрутизацією.
Приємним бонусом стане те, що після цієї лекції наш додаток почне виглядати як щось, що може бути корисним у реальному житті. А це ж головна мета веб-розробки, правда?
1. Завдання: створення простого застосунку з маршрутами
Ми будемо створювати застосунок для управління книгами в невеликому книжковому магазині. У застосунку будуть маршрути для відображення списку книг і деталей книги, а також для додавання нових книг. Цей міні-проєкт дозволить нам вивчити:
- Як створювати маршрути та зв'язувати їх із представленнями.
- Як використовувати динамічні URL.
- Як організувати маршрути на рівні застосунку.
2. Підготовка: структура проєкту
Перш ніж рухатися вперед, переконаймося, що у нас є встановлений проєкт Django. Якщо ти слідуєш курсу, у тебе вже є проєкт (якщо ні, повернися до лекцій перших рівнів). У рамках цього проєкту створимо новий застосунок:
python manage.py startapp books
Потім зареєструємо застосунок у INSTALLED_APPS у файлі settings.py:
# settings.py
INSTALLED_APPS = [
...,
'books', # Додаємо наш застосунок
]
3. Додавання маршрутів у застосунку
3.1. Організація файлів
У Django кожен застосунок повинен мати свій власний файл urls.py для маршрутизації. Створимо його у застосунку books:
touch books/urls.py
Структура папок застосунку books буде виглядати так:
books/
migrations/
__init__.py
admin.py
apps.py
models.py
tests.py
urls.py
views.py
Тепер додамо у urls.py базову конфігурацію маршрутів:
# books/urls.py
from django.urls import path
from . import views # Імпортуємо наші представлення
urlpatterns = [
path('', views.book_list, name='book_list'), # Відображення списку книг
path('<int:pk>/', views.book_detail, name='book_detail'), # Деталі книги
path('add/', views.book_add, name='book_add'), # Додавання книги
]
3.2. Підключення маршрутів застосунку до проєкту
Тепер потрібно "включити" маршрути застосунку books у основний конфігураційний файл проєкту urls.py, який знаходиться у папці проєкту:
# project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', include('books.urls')), # Підключаємо маршрути застосунку books
]
Використовуючи функцію include(), ми підключаємо маршрути застосунку books до простору URL /books/.
4. Створення представлень у додатку
Тепер створимо кілька представлень для маршрутів, які ми щойно додали в books/urls.py.
4.1. Представлення для списку книг
У файлі views.py додамо функцію book_list, яка буде використовувати HttpResponse для повернення списку книг:
# books/views.py
from django.http import HttpResponse
def book_list(request):
return HttpResponse("Список всіх книг")
Спробуйте запустити сервер (python manage.py runserver) і відкрити http://127.0.0.1:8000/books/ у браузері. Ви повинні побачити текст "Список всіх книг". Вітаю, ви створили перший маршрут!
4.2. Представлення для деталей книги
Тепер створимо маршрут, який буде обробляти динамічний URL з параметром pk — це ідентифікатор книги з бази даних. Додайте функцію book_detail у файл views.py:
# books/views.py
def book_detail(request, pk):
return HttpResponse(f"Деталі книги з ID {pk}")
Спробуйте відкрити http://127.0.0.1:8000/books/5/. Ви повинні побачити текст "Деталі книги з ID 5". Цей приклад демонструє, як передавати параметри з URL у представлення.
4.3. Представлення для додавання нової книги
Додамо маршрут для створення нових книг. Припустимо, поки що це буде простий маршрут, який повертає текст:
# books/views.py
def book_add(request):
return HttpResponse("Додавання нової книги")
Тепер маршрут http://127.0.0.1:8000/books/add/ повинен повертати текст "Додавання нової книги".
5. Реалізація різних сценаріїв маршрутизації
5.1. Використання namespace
Під час роботи з великими проєктами буває корисно групувати маршрути застосунків. Додамо namespace для маршрутів застосунку books.
Змінимо підключення маршрутів у головному urls.py:
# project/urls.py
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('books/', include(('books.urls', 'books'), namespace='books')), # Додали namespace
]
Тепер маршрути застосунку можна викликати, посилаючись на їх імена через namespace. Наприклад:
# Приклад посилання на маршрут у шаблоні
<a href="{% url 'books:book_list' %}">Список книг</a>
5.2. Динамічні URL та параметри
Ми вже створили маршрут для динамічного URL /<int:pk>/. Але що, якщо ми захочемо додати кілька параметрів? Наприклад, фільтрацію книг за жанром і роком видання.
Змінимо urls.py:
# books/urls.py
urlpatterns = [
path('', views.book_list, name='book_list'),
path('<int:pk>/', views.book_detail, name='book_detail'),
path('add/', views.book_add, name='book_add'),
path('genre/<str:genre>/year/>int:year>/', views.book_filter, name='book_filter'),
]
І додамо представлення book_filter:
# books/views.py
def book_filter(request, genre, year):
return HttpResponse(f"Книги жанру {genre} за {year} рік")
Тепер, якщо ви відкриєте http://127.0.0.1:8000/books/genre/fantasy/year/2023/, то побачите: "Книги жанру fantasy за 2023 рік".
6. Перевірка готової маршрутизації
Спробуйте протестувати всі створені маршрути. Ви повинні побачити відповідні відповіді:
/books/— "Список всіх книг"./books/5/— "Деталі книги з ID 5"./books/add/— "Додавання нової книги"./books/genre/fantasy/year/2023/— "Книги жанру fantasy за 2023 рік".
Часті проблеми та їх вирішення
Помилка 404 при спробі зайти на маршрут.
- Переконайтеся, що ваш маршрут прописаний у потрібному
urls.py. - Перевірте, що параметри в URL (наприклад,
<int:pk>) строго відповідають типам даних.
- Переконайтеся, що ваш маршрут прописаний у потрібному
Не вдається підключити застосунок.
- Перевірте, чи додано назву застосунку в
INSTALLED_APPSуsettings.py.
- Перевірте, чи додано назву застосунку в
Проблеми з
namespace.- Переконайтеся, що ви правильно оголосили
namespaceпри підключенні маршрутів застосунку.
- Переконайтеся, що ви правильно оголосили
В результаті сьогоднішньої роботи у нас з'явився працюючий набір маршрутів для застосунку "Книжковий магазин". Ми зрозуміли, як зв'язувати URL з представленнями, використовувати динамічні параметри та організовувати маршрути на рівні застосунку. Чудова робота, продовжуємо розвивати наш проєкт!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ