В этой лекции мы переведём все накопленные знания в практику — создадим приложение с полноценной маршрутизацией.
Приятным бонусом станет то, что после этой лекции наше приложение начнёт выглядеть как что-то, что может быть полезным в реальной жизни. А ведь это главная цель веб-разработки, верно?
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 с представлениями, использовать динамические параметры и организовывать маршруты на уровне приложения. Отличная работа, продолжаем развивать наш проект!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ