JavaRush /Курсы /Модуль 3: Django /Практическое создание маршрутов для приложения

Практическое создание маршрутов для приложения

Модуль 3: Django
3 уровень , 9 лекция
Открыта

В этой лекции мы переведём все накопленные знания в практику — создадим приложение с полноценной маршрутизацией.

Приятным бонусом станет то, что после этой лекции наше приложение начнёт выглядеть как что-то, что может быть полезным в реальной жизни. А ведь это главная цель веб-разработки, верно?

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 год".

Частые проблемы и их решение

  1. Ошибка 404 при попытке зайти на маршрут.

    • Убедитесь, что ваш маршрут прописан в нужном urls.py.
    • Проверьте, что параметры в URL (например, <int:pk>) строго соответствуют типам данных.
  2. Не удаётся подключить приложение.

    • Проверьте, добавлено ли название приложения в INSTALLED_APPS в settings.py.
  3. Проблемы с namespace.

    • Убедитесь, что вы правильно объявили namespace при подключении маршрутов приложения.

В результате сегодняшней работы у нас появился работающий набор маршрутов для приложения "Книжный магазин". Мы поняли, как связывать URL с представлениями, использовать динамические параметры и организовывать маршруты на уровне приложения. Отличная работа, продолжаем развивать наш проект!

1
Задача
Модуль 3: Django, 3 уровень, 9 лекция
Недоступна
Создание базового маршрута
Создание базового маршрута
1
Задача
Модуль 3: Django, 3 уровень, 9 лекция
Недоступна
Динамические маршруты
Динамические маршруты
3
Опрос
Динамические URL, 3 уровень, 9 лекция
Недоступен
Динамические URL
Динамические URL
Комментарии (5)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Дмитрий/MrJonson Уровень 62
4 сентября 2025
Специально потыкал от балды 5 из 14 проверка ТЕСТ СДАН, офигенная проверка......
Евгений Уровень 69
28 июля 2025
Ошибка в Опросе. Как выглядит динамический маршрут, который принимает параметр id в Django URL ? Дается 4 варианта с неправильными ответами. Правильным будет 2ой :)
Артём Васенин Уровень 67
3 августа 2025
Жесть. Баг на баге
Ivan Уровень 59
28 июня 2025

'genre/>str:genre>/year/>int:year>/'
Это что за синтаксис такой? Может всё-таки

'genre/<str:genre>/year/<int:year>/'
Ivan Уровень 59
28 июня 2025

path('books/', include(('books.urls', 'books'), namespace='books'))
В главе про namespace такой синтекс не показывали. Там мы просто писали

# books/urls.py

app_name = 'books'
А этот код пока выглядит как масло масляное.