VIEWS И URL В DJANGO

МАРШРУТИЗАЦИЯ И ШАБЛОНЫ

Маршрутизация и представления в Django

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.