Гид по технологиям

Динамические URL в Django: как создать маршруты для приложения Boma-watch

6 min read Django Обновлено 09 Jan 2026
Динамические URL в Django — маршруты для Boma-watch
Динамические URL в Django — маршруты для Boma-watch

Графическое изображение — синий круг с расходящимися линиями от центра.

Введение

Без динамической маршрутизации было бы неудобно переходить между страницами в приложении — пришлось бы вручную вводить полный путь к каждой странице. Django решает эту задачу с помощью URLconf: набора выражений URL, привязанных к представлениям (views).

Этот материал показывает, как на примере приложения Boma-watch реализовать динамические URL, которые подставляют идентификатор района в маршрут и отображают профиль района на отдельной странице.

Важно: в примерах используется модель NeighbourHood. Если вы ещё не знакомы с моделями Django и миграциями — сначала создайте модель и выполните миграции (python manage.py makemigrations, python manage.py migrate).

1. Создание проекта и приложения

Создайте Django-проект и приложение. Назовите приложение Boma-watch. В приложении реализуйте модель NeighbourHood — она будет содержать поля для названия, описания, локации, телефон службы здравоохранения, номер полиции, логотипа и количества жителей.

Модель не показана здесь подробно: создайте её в models.py и выполните миграции. Затем создайте представления и шаблоны, описанные ниже.

2. Представления (views)

В Django представления — это функции или классы, которые принимают HTTP-запрос и возвращают HTTP-ответ. Чтобы представление работало, его нужно связать с URL.

Пример импорта и двух простых функций-представлений (копируйте в файл views.py приложения):

from django.shortcuts import render  
from .models import NeighbourHood  
def home(request):  
     neighborhoods = NeighbourHood.objects.all()  
     return render (request, "home.html", {'neighborhoods':neighborhoods})  
def join_hood(request, id):  
     neighborhood = NeighbourHood.objects.get(id=id)  
     return render (request, 'join_hood.html', {'neighborhood':neighborhood})

Короткие пояснения:

  • home: получает все районы из БД и рендерит шаблон home.html.
  • join_hood: получает конкретный район по id и рендерит join_hood.html.

Совет: обрабатывайте исключение NeighbourHood.DoesNotExist и возвращайте 404 через get_object_or_404 для более корректной обработки ошибок.

Важно: при работе с реальными данными используйте валидацию и обработку исключений, а также проверяйте доступы пользователей (авторизацию).

3. Создание динамического URL

Добавьте маршруты в urls.py приложения (или в корневой urls.py, если хотите подключить приложение). Ниже — пример urls.py внутри приложения:

from django.urls import path  
from . import views  
from django.conf import settings  
from django.conf.urls.static import static  
from django.contrib.staticfiles.urls import staticfiles_urlpatterns  
  
urlpatterns = [  
      path ('home', views.home, name='home'),  
      path ('join_hood//', views.join_hood, name='join_hood'),  
]  
  
if settings.DEBUG:  
     urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)  
  

Пояснения:

  • path(‘join_hood//‘, …) — динамическая часть в угловых скобках перехватывает часть URL и передаёт её как параметр в представление.
  • Конвертеры: str, int, slug, path, uuid. Они ограничивают тип значения и помогают маршрутизатору правильно сопоставлять пути.
  • Имя маршрута (name=’join_hood’) удобно использовать в шаблонах через тег {% url %}.

4. Шаблон join_hood.html

Создайте шаблон join_hood.html в каталоге templates приложения. Пример шаблона (сохраняйте как есть в файле):

{% extends "base.html" %}  
  
{% load static %}  
  
{% block content %}  
Welcome!

Name: {{neighbourhood.name}}

Location: {{neighbourhood.location}}

Description: {{neighbourhood.description}}

Health Tel:{{neighbourhood.health_tell}}

Police Number: {{neighbourhood.police_number}}

Residents : {{neighbourhood.Count}}

{% endblock %}

В этом шаблоне используются переменные, переданные представлением join_hood. При клике по ссылке с конкретным id пользователь попадёт на страницу с профилем района.

5. Шаблон home.html и ссылка на динамический маршрут

Шаблон, который рендерит список районов и формирует ссылку на join_hood:

{% extends 'base.html' %}  
  
{% load static %}  
  
{% block content %}  
{{user.neighborhood.name}}
{% for neighborhood in neighborhoods %}
{{user.hood.name}}
{{neighborhood.name}} ({{neighborhood.location}}) {{neighborhood.Count}} member{{neighborhood.members.count|pluralize}}

{{neighborhood.description}}

{{neighborhood.member.Count}}

Join Hood
{% endblock %}

Ключевой момент: в ссылке используется тег {% url ‘join_hood’ neighborhood.id %} — именно имя маршрута и параметр обеспечивают формирование корректного href.

Скриншот домашней страницы с карточками районов

6. Тестирование динамической маршрутизации

Запустите локальный сервер (python manage.py runserver) и перейдите на http://127.0.0.1:8000/home/. Нажмите кнопку “Join Hood” на карточке района — вы должны перейти на страницу с адресом вида http://127.0.0.1:8000/join_hood/2/ (id соответствует выбранному элементу).

Если всё настроено верно, на странице join_hood появятся данные выбранного района.

Скриншот страницы join_hood с деталями выбранного района

Когда это не подходит

  • Если вы хотите публичные SEO-дружелюбные адреса — используйте slug вместо id (поле slug в модели). slug обычно содержит читаемую строку, например my-neighborhood.
  • Если вам нужна безопасность и непредсказуемость идентификатора — используйте uuid.
  • Для вложенных и сложных путей лучше комбинировать path и include, а не строить длинные шаблонные строки.

Альтернативные подходы

  • Использовать символьный slug: path(“join_hood//“, …). Это улучшает читабельность URL и SEO.
  • REST API: для API-эндпойнтов применяйте Django REST Framework — маршруты и сериализаторы упрощают работу с данными и интеграции с фронтендом.
  • Клиентская маршрутизация: если приложение одностраничное (SPA), маршрутизацию можно реализовать на фронтенде, а Django использовать как API.

Проверка и критерии приёмки

Критерии приёмки:

  • Список районов отображается на /home/ и содержит корректные данные.
  • По нажатию на ссылку переход происходит на /join_hood// и отображается профиль с совпадающим id.
  • При несуществующем id возвращается 404 страница.
  • Статические и медиа-файлы (логотипы) загружаются и отображаются при DEBUG=True и верной настройке MEDIA_URL/MEDIA_ROOT.

Минимальные тестовые сценарии:

  • Открыть /home/ — видеть N карточек (N>0).
  • Нажать Join Hood на первой карточке — проверить URL и содержимое.
  • Ввести вручную несуществующий id — проверить, что сервер возвращает 404.

Чек-листы по ролям

Разработчик:

  • Создать модель NeighbourHood и выполнить миграции.
  • Написать представления home и join_hood.
  • Добавить paths в urls.py и дать именованные маршруты.
  • Обработать NeighbourHood.DoesNotExist или использовать get_object_or_404.
  • Настроить MEDIA_URL и MEDIA_ROOT для логотипов.

QA:

  • Проверить переходы по всем карточкам.
  • Проверить отображение изображений и полей.
  • Тестировать поведение при пустых полях и при отсутствии логотипа.

DevOps:

  • Убедиться, что статические и медиа-файлы обслуживаются корректно в проде (nginx/whitenoise).
  • Настроить правила CORS, если фронтенд запрашивает API.

Краткая методология внедрения (минимальный SOP)

  1. Создать модель и мигрировать.
  2. Написать базовые представления и шаблоны.
  3. Добавить маршруты и проверить локально.
  4. Написать тесты (unit/functional).
  5. Развернуть и проверить на staging, затем на production.

Пример дерева принятия решения (какой converter выбрать)

flowchart TD
  A[Есть ли требование к читаемости URL?] -->|Да| B{Нужен readable URL}
  B -->|Да| C[Использовать slug]
  B -->|Нет| D{Нужна безопасность}
  D -->|Да| E[Использовать uuid]
  D -->|Нет| F[Использовать int или str]

Глоссарий (1 строка)

  • URLconf — модуль в Django, где описываются сопоставления URL и представлений.
  • View — функция или класс, обрабатывающий HTTP-запросы и возвращающий ответы.
  • slug — человеко-читаемый идентификатор в URL.
  • uuid — универсальный уникальный идентификатор.

Безопасность и приватность

  • Не храните чувствительные данные в URL (пароли, токены).
  • Для приватных данных проверяйте права доступа в представлениях перед выдачей содержимого.

Краткая памятка по распространённым ошибкам

  • Ошибка 404 для медиаконтента: проверьте MEDIA_URL, MEDIA_ROOT и настройки сервера в боевом окружении.
  • Несоответствие имен маршрутов: убедитесь, что в шаблонах используется имя, указанное в urls.py.
  • Необработанное DoesNotExist: используйте get_object_or_404 или try/except.

Итог

Динамические URL в Django — надёжный и гибкий инструмент для навигации по приложениям. Они позволяют легко передавать параметры в представления, поддерживают разные конвертеры типов и хорошо сочетаются с шаблонами и системой именованных маршрутов. Используйте slug для читаемых адресов, uuid для безопасности и обрабатывайте ошибки для корректной UX.

Ключевые шаги:

  • создать модель и представления;
  • добавить динамический маршрут с параметром в urls.py;
  • в шаблонах использовать тег {% url %} с именем маршрута;
  • покрыть сценарии тестами и обработать ошибки.

Спасибо — теперь вы можете внедрить динамические URL в своём Django-приложении и адаптировать подход под требования проекта.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

RDP: полный гид по настройке и безопасности
Инфраструктура

RDP: полный гид по настройке и безопасности

Android как клавиатура и трекпад для Windows
Гайды

Android как клавиатура и трекпад для Windows

Советы и приёмы для работы с PDF
Документы

Советы и приёмы для работы с PDF

Calibration в Lightroom Classic: как и когда использовать
Фото

Calibration в Lightroom Classic: как и когда использовать

Отключить Siri Suggestions на iPhone
iOS

Отключить Siri Suggestions на iPhone

Рисование таблиц в Microsoft Word — руководство
Office

Рисование таблиц в Microsoft Word — руководство