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

Динамические URL в Django — пример и руководство

7 min read Django Обновлено 05 Dec 2025
Динамические URL в Django — пример и руководство
Динамические URL в Django — пример и руководство

Синяя окружность с расходящимися от центра синими линиями.

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

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

Что такое динамический URL (кратко)

Динамический URL — это путь, который содержит переменные части. Например, /join_hood/2/ — здесь «2» может быть id района. Django читает часть пути, преобразует её в нужный тип (int, str, slug, uuid) и передаёт в функцию представления как аргумент.

Пара терминов в одну строку:

  • URLconf — модуль Django, где описывают маршруты.
  • View (представление) — функция или класс, принимающий HTTP‑запрос и возвращающий ответ.

Основные шаги

  1. Создать проект и приложение Django (Boma-watch).
  2. Определить модель NeighbourHood и выполнить миграции.
  3. Создать представления: список и детальный просмотр района.
  4. Настроить динамический путь в urls.py.
  5. Сделать шаблоны home.html и join_hood.html и протестировать маршруты.

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

Создайте проект Django и приложение с именем Boma-watch. Приложение будет хранить данные о районах: название, местоположение, описание, контакты, логотип и количество жителей.

Создайте модель NeighbourHood в models.py и выполните makemigrations/migrate. Если вы не знакомы с моделями Django, начните с официального руководства по моделям.

Важно: в коде примеров ниже используется имя модели NeighbourHood (с «ou»). Сохраняйте точное имя класса в коде и шаблонах, чтобы избежать ошибок импорта.

2. Создайте функции представления

Представления — это функции в файле views.py. Они получают request и возвращают рендер шаблона.

Ниже — пример кода из исходного руководства. Скопируйте в views.py и при необходимости поправьте отступы/кодировку.

        `from django.shortcuts import render  
from .models import NeighbourHood  
`
    

Далее — представление home, которое получает все районы и передаёт их в шаблон home.html.

        `def home(request):  
     neighborhoods = NeighbourHood.objects.all()  
     return render (request, "home.html", {'neighborhoods':neighborhoods})  
`
    

Представление join_hood получает конкретный район по id и возвращает join_hood.html.

        `def join_hood(request, id):  
     neighborhood = NeighbourHood.objects.get(id=id)  
     return render (request, 'join_hood.html', {'neighborhood':neighborhood})`
    

Советы по надёжности:

  • Используйте get_object_or_404(NeighbourHood, id=id), чтобы корректно обрабатывать несуществующие id.
  • Логируйте исключения при выборке данных.

3. Настройте динамический URL (URLconf)

В urls.py приложения подключите path и представления. Пример:

        `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//‘, …) — часть в угловых скобках передаётся в функцию представления как аргумент id.
  • Конвертеры: str, int, slug, path, uuid. Они ограничивают формат и помогают избежать неверных вызовов.
  • Имя маршрута (name=’join_hood’) удобно использовать в шаблонах для генерации ссылки.
  • static и staticfiles подключают статические и медиа‑файлы в режиме DEBUG.

Важно: выбирайте тип конвертера исходя из бизнеса: если id — целое число, используйте int. Для человекочитаемых URL применяйте slug.

4. Шаблоны: передаём и отображаем данные

Создайте шаблон join_hood.html, который расширяет base.html и выводит поля района. Ниже — пример шаблона из исходника (с сохранением синтаксиса Django‑шаблонов):

        `{% 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 %}`

Затем сделайте шаблон home.html, где перечисляются все районы и есть кнопка перехода к профилю:

        `{% 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 %}`

Пояснения и рекомендации:

  • Убедитесь, что в цикле for используется та же переменная, что и в контексте (‘neighborhoods’).
  • Используйте {% url ‘join_hood’ neighborhood.id %} для генерирования ссылки по имени маршрута.
  • Альт‑текст для изображений должен отражать содержимое (логотип района или миниатюра).

Домашняя страница: список всех районов

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

При клике на кнопку «Join Hood» пользователь попадает на URL вида http://127.0.0.1:8000/join_hood/2/ — где «2» — id района. Страница join_hood.html показывает профиль выбранного района.

join_hood: профиль района в браузере

Проверки при тестировании:

  • Подтвердите, что правильный объект загружается по id.
  • Наблюдайте корректную обработку несуществующих id (404).
  • Проверьте, что ссылки генерируются через {% url %}, а не формируются вручную.

Важно: в продакшн‑режиме используйте более строгие проверки прав доступа (is_authenticated, разрешения) перед показом приватных данных.

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

  • Использовать slug вместо id: человекочитаемые URL, удобнее для SEO, например /join-hood/central-park/. Подходит, когда название уникально.
  • Использовать uuid: безопаснее при публичных API и когда не хочется раскрывать последовательные id.
  • Передавать данные через query string ?id=2 — просто, но менее аккуратно и хуже для семантики URL.

Когда не использовать динамические пути:

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

Ментальные модели и эвристики

  • Модель RESTful: путь указывает ресурс, а HTTP‑метод — действие. Например, GET /neighborhoods/2/ — получить район.
  • Правило «читаемости»: URL должен быть информативным и предсказуемым.
  • Безопасность: не доверяйте входным параметрам в пути — всегда валидируйте.

Факт‑бокс: что важно помнить

  • Конвертеры Django: str, int, slug, path, uuid.
  • Используйте name в path() для обратной генерации URL в шаблонах.
  • get_object_or_404 упрощает обработку отсутствующих записей.

Чеклист для внедрения (роли)

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

  • Определил модель и выполнил миграции.
  • Добавил представления и обработку ошибок.
  • Настроил path с корректным конвертером.
  • Обновил шаблоны, использует {% url %}.

Тестировщик:

  • Проверил переходы между страницами.
  • Проверил обработку неверных id (404).
  • Прогнал автоматические тесты для view и URL.

Дизайнер/Контент:

  • Дал информативные alt для изображений.
  • Убедился, что контент корректно отображается при пустых полях.

SOP: быстрая инструкция для исправления ошибок маршрутизации

  1. Перейдите в браузере по проблемному URL и посмотрите код ошибки (404, 500).
  2. Проверьте соответствие имени маршрута в {% url %} и name в urls.py.
  3. Убедитесь, что в представление передаётся ожидаемый тип аргумента (int/str/slug).
  4. В представлении замените .get(…) на get_object_or_404(…). Проверьте логи сервера.
  5. Если проблема со статикой — убедитесь в настройках MEDIA_URL, MEDIA_ROOT и DEBUG.

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

  • Список районов доступен по пути /home.
  • Переход по кнопке перенаправляет на /join_hood// и отображает данные выбранного района.
  • Некорректные id возвращают 404.
  • Шаблоны используют {% url %} и корректные alt‑тексты.

Диагностическая диаграмма (простое решение проблем)

flowchart TD
  A[Пользователь кликает ссылку] --> B{URL корректен?}
  B -- Нет --> C[Проверить имя маршрута и {% url %}]
  B -- Да --> D{Объект найден?}
  D -- Нет --> E[Использовать get_object_or_404 -> 404]
  D -- Да --> F[Отобразить шаблон join_hood]
  C --> G[Исправить urls.py или шаблон]
  G --> B

Примеры тестов / критерии приёмки

  • Тест: GET /join_hood/1/ возвращает статус 200 и содержит название района.
  • Тест: GET /join_hood/99999/ возвращает статус 404.
  • Тест: ссылка в home.html указывает через {% url ‘join_hood’ neighborhood.id %}.

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

  • Не показывайте приватные поля без проверки прав доступа.
  • Для форм редактирования района проверяйте CSRF и права пользователя.
  • Для публичных данных убедитесь, что нет утечек чувствительной информации в шаблонах.

Заключение

Динамические URL в Django — простой и мощный инструмент. Они делают пути понятными, улучшают структуру приложения и облегчают генерацию ссылок. Следуя шагам выше вы сможете:

  • Корректно настроить маршруты и конвертеры.
  • Надёжно подгружать данные по id/slug/uuid.
  • Проверять и отлаживать поведение в тестах.

Важно: адаптируйте конвертеры маршрутов под бизнес‑логику (id для внутренних ресурсов, slug для человекочитаемых URL).

Ключевые действия: создайте модель, добавьте представления, настройте path с переменными, сделайте шаблоны с {% url %} и протестируйте переходы.

Счастливой разработки!

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

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

Анализ тональности на Python с VADER и Tkinter
Обработка текста

Анализ тональности на Python с VADER и Tkinter

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

Проверить прокси в Windows

Темы рабочего стола в Ubuntu 18.04 LTS
Linux

Темы рабочего стола в Ubuntu 18.04 LTS

Что делать, если Logitech G Pro Wireless не работает
Техподдержка

Что делать, если Logitech G Pro Wireless не работает

Dev Drive в Windows 11 — как начать
Разработка

Dev Drive в Windows 11 — как начать

Как сбросить и перезапустить OneDrive в Windows 10
Windows 10

Как сбросить и перезапустить OneDrive в Windows 10