--- status: seed type: concept tags: [django, routing, templates, cbv, fbv] created: 2026-05-30 updated: 2026-05-30 title: Django: Представления, шаблоны и CBV source: ["[[lec2-django_lec_urls_views_templates-1.pdf]]", "[[lec3-django_cbv-1.pdf]]", "[[p4-django_cbv-1.pdf]]"] --- # Django: Представления и Шаблоны ## Маршрутизация (URL Routing) - Описывается в `urlpatterns` с помощью `path()` и `re_path()`. - Конвертеры: ``, ``, ``. - Включение других файлов: `path('blog/', include('blog.urls'))`. - Реверсирование: `{% url 'name' %}` в шаблонах или `reverse('name')` в Python. --- ## Представления (Views) Views принимают `HttpRequest` и возвращают `HttpResponse`. ### Функциональные представления (FBV) ```python from django.shortcuts import render, get_object_or_404 def index(request): latest_items = Model.objects.all()[:5] return render(request, "app/index.html", {"items": latest_items}) ``` ### Классовые представления (CBV) Абстрагируют типичные задачи. Вызываются в URL через `.as_view()`. - **TemplateView:** Отображение статического шаблона. - **ListView:** Автоматический список объектов (данные в `object_list`). - **DetailView:** Детальная информация об одном объекте (ищет по `pk` или `slug`). **Пример ListView:** ```python class PostListView(ListView): model = Post template_name = "blog/list.html" context_object_name = "posts" paginate_by = 10 ``` --- ## Шаблоны (Templates) Используют **Django Template Language (DTL)**. ### Синтаксис - **Переменные:** `{{ var.attr }}`. - **Теги:** `{% if %}`, `{% for %}`, `{% url %}`, `{% csrf_token %}`. - **Фильтры:** `{{ date|date:"Y-m-d" }}`, `{{ list|length }}`, `{{ text|lower }}`. ### Наследование шаблонов Позволяет избежать дублирования HTML-кода. - **Базовый шаблон (`base.html`):** Определяет блоки `{% block content %}{% endblock %}`. - **Дочерний шаблон:** Использует `{% extends "base.html" %}` и переопределяет блоки. --- ## Статические файлы (Static) - Подключаются через `{% load static %}`. - Настройки в `settings.py`: `STATIC_URL`, `STATICFILES_DIRS`. - В продакшне используется команда `python manage.py collectstatic`.