Views и URL в Django
Маршруты, представления, шаблоны
Как Django обрабатывает запрос
Браузер запрашивает адрес, Django ищет его в urls.py сверху вниз, вызывает найденное представление, а то возвращает ответ — HTML, редирект или JSON. Если совпадения нет, отдаётся 404.
Первое представление
Создайте файл blog/views.py и добавьте функцию. Представление — обычная функция Python, которая принимает запрос и возвращает ответ: def index(request): return HttpResponse("Привет, мир").
Маршрут
Свяжите функцию с адресом в config/urls.py:
from django.urls import path
from blog import views
urlpatterns = [
path("", views.index, name="index"),
path("post/<slug:slug>/", views.post_detail, name="post_detail"),
]
Конвертеры в угловых скобках задают тип и имя параметра: str, int, slug, uuid, path. Значение приходит в функцию вторым аргументом.
name — это не украшение. По имени строятся ссылки в шаблонах, и при смене адреса их не придётся править вручную.
Приложения и include
Держать все маршруты в одном файле быстро надоедает. В приложении создаётся свой blog/urls.py, а в корневом он подключается через path("blog/", include("blog.urls")). Задайте app_name = "blog" — тогда имена станут с пространством имён, и два приложения с одинаковым index перестанут конфликтовать.
Шаблоны и контекст
Вместо строки обычно возвращают render — он подставляет данные в HTML:
from django.shortcuts import render, get_object_or_404
from .models import Post
def post_detail(request, slug):
post = get_object_or_404(Post, slug=slug)
return render(request, "blog/post.html", {"post": post})
get_object_or_404 — короткая запись «найти или отдать 404». Без неё поиск бросит исключение, и посетитель увидит 500.
В шаблоне данные выводятся двойными скобками, а теги — фигурными со знаком процента. Наследование от базового шаблона избавляет от копирования шапки и подвала на каждой странице.
Типичные ошибки
- NoReverseMatch. Имя маршрута не совпадает с
nameили не передан обязательный параметр. Проверьте пространство имён. - 404 вместо страницы. Часто дело в слэше в конце: адрес со слэшем и без него — разные маршруты.
- Вся логика во view. Функция на 300 строк с запросами, письмами и расчётами не тестируется.
- Сырой HTML в коде. Строки с разметкой внутри представления невозможно поддерживать.
Нужен сайт на Django, а не статья?
Сделаю проект под ключ: модели данных, админка, интеграции с 1С и оплатой, REST API, деплой на ваш сервер с HTTPS и резервными копиями. С 2009 года, по договору, с поддержкой после запуска.
Полезно по теме: модели Django, установка Django, деплой на VPS, обзор Django.