Python и веб-разработка на Django

Этот курс предназначен для освоения языка Python и создания веб-приложений с использованием фреймворка Django. Вы пройдете путь от основ синтаксиса и объектно-ориентированного программирования до разработки полноценного серверного приложения с базой данных.

1. Основы Python: синтаксис, типы данных, функции и введение в ООП

Основы Python: синтаксис, типы данных, функции и введение в ООП

Добро пожаловать в курс «Python и веб-разработка на Django». Это первая и фундаментальная статья, которая заложит основу для всего вашего дальнейшего пути в веб-разработке. Прежде чем мы начнем создавать сложные веб-приложения, нам необходимо освоить инструмент, на котором они строятся — язык программирования Python.

Python славится своим чистым синтаксисом и читаемостью кода. Однако за этой простотой скрывается мощная объектно-ориентированная структура, понимание которой критически важно для работы с фреймворком Django. В этой статье мы разберем ключевые концепции языка, необходимые для старта.

Философия и синтаксис Python

Python — это интерпретируемый язык высокого уровня. Одной из его главных особенностей является использование отступов (пробелов) для выделения блоков кода. В отличие от C++ или Java, где используются фигурные скобки {}, или Pascal с операторами begin и end, в Python структура программы определяется визуальным выравниванием.

!Сравнение структуры кода: отступы в Python против скобок в других языках

Правила отступов

Стандарт PEP 8 (официальное руководство по стилю кода Python) рекомендует использовать 4 пробела для каждого уровня вложенности. Смешивание табуляции и пробелов строго запрещено и приведет к ошибке IndentationError.

Пример правильной структуры:

Комментарии

Комментарии игнорируются интерпретатором и служат для пояснения кода.

  • Однострочные комментарии начинаются с символа #.
  • Многострочные комментарии (docstrings) заключаются в тройные кавычки """ или '''.
  • Переменные и типы данных

    В Python типизация является динамической и строгой.

  • Динамическая: вам не нужно объявлять тип переменной заранее (как int x в C++). Тип определяется автоматически в момент присваивания значения.
  • Строгая: язык не будет неявно преобразовывать типы, если это может привести к потере данных или неоднозначности (например, нельзя сложить строку и число без явного преобразования).
  • Основные типы данных

    Рассмотрим типы, с которыми вы будете сталкиваться в Django постоянно.

    #### Числа (Numbers)

    Существует два основных числовых типа:

  • int (целые числа): 10, -5, 0.
  • float (числа с плавающей точкой): 10.5, 3.14.
  • #### Строки (Strings)

    Строки в Python — это неизменяемые последовательности символов. Их можно заключать как в одинарные ', так и в двойные " кавычки.

    Особое внимание стоит уделить f-строкам (formatted string literals), появившимся в Python 3.6. Они позволяют встраивать значения переменных прямо в строку:

    #### Булевы значения (Booleans)

    Тип bool может принимать только два значения: True (истина) и False (ложь). Обратите внимание, что они пишутся с большой буквы.

    Структуры данных

    Для работы с наборами данных Python предлагает мощные встроенные структуры. В веб-разработке они используются повсеместно: от передачи данных из базы в шаблон до обработки JSON-запросов.

    Списки (Lists)

    Список — это упорядоченная изменяемая коллекция объектов произвольных типов. Списки создаются с помощью квадратных скобок [].

    Кортежи (Tuples)

    Кортеж — это упорядоченная неизменяемая коллекция. Создается с помощью круглых скобок ().

    > Кортежи работают быстрее списков и защищают данные от случайного изменения. В Django они часто используются для хранения настроек, которые не должны меняться в процессе работы приложения.

    Словари (Dictionaries)

    Словарь — это неупорядоченная коллекция пар «ключ-значение». Это одна из самых важных структур для веб-разработчика, так как она идеологически близка к формату JSON.

    Управляющие конструкции

    Логика программы строится на условных операторах и циклах.

    Условный оператор if

    Конструкция if-elif-else позволяет выполнять код в зависимости от условий.

    Циклы

  • Цикл for: используется для перебора последовательностей (списков, строк, словарей).
  • Цикл while: выполняется, пока условие истинно.
  • Пример перебора списка:

    Функции

    Функции позволяют упаковывать код в переиспользуемые блоки. В Python функции определяются ключевым словом def.

    Важно понимать разницу между print() и return. print() просто выводит текст в консоль, тогда как return возвращает значение из функции, которое можно сохранить в переменную или использовать дальше.

    Введение в Объектно-Ориентированное Программирование (ООП)

    Django — это фреймворк, полностью построенный на принципах ООП. Понимание классов и объектов является обязательным условием для работы с ним. В Django всё является объектами: запросы, ответы, модели базы данных и формы.

    Основные понятия ООП

  • Класс (Class): Это чертеж или шаблон, описывающий структуру и поведение будущих объектов.
  • Объект (Object) или Экземпляр (Instance): Это конкретная реализация класса, созданная по шаблону.
  • !Класс как чертеж и объекты как реализации этого чертежа

    Создание класса в Python

    Рассмотрим пример класса, описывающего пост в блоге (что очень похоже на то, как мы будем описывать модели в Django).

    Разбор ключевых элементов

    * class BlogPost:: Объявление нового класса. * __init__: Специальный метод (магический метод), который вызывается автоматически при создании нового объекта. Он инициализирует начальное состояние объекта. self: Это ссылка на текущий* экземпляр объекта. Когда вы создаете 10 разных статей, self позволяет программе понять, у какой именно статьи нужно изменить заголовок или количество лайков. Это аналог this в Java или C++.

    Использование класса

    Наследование

    Наследование — это механизм, позволяющий создавать новый класс на основе существующего. Это «суперсила» Django. Например, создавая страницу сайта, вы будете наследовать свой класс от базового класса Django, автоматически получая весь его функционал.

    В данном примере VideoPost имеет все методы BlogPost (например, add_like), но также имеет свой уникальный метод play.

    Заключение

    Мы рассмотрели фундамент языка Python: от базового синтаксиса и типов данных до принципов ООП. Эти знания — ваш инструментарий. Списки и словари помогут вам структурировать данные, функции — организовать логику, а классы станут основой для моделей и представлений в Django.

    В следующих статьях мы перейдем к настройке окружения и установке самого фреймворка Django, где вы увидите, как эти концепции применяются на практике.

    2. Введение в Django: установка, настройка окружения и архитектура MVT

    Введение в Django: установка, настройка окружения и архитектура MVT

    Поздравляю с успешным освоением основ Python! В предыдущей статье мы изучили синтаксис, функции и объектно-ориентированное программирование. Теперь у вас есть необходимый фундамент для перехода к созданию реальных веб-приложений. В этой статье мы начнем знакомство с Django — одним из самых популярных и мощных веб-фреймворков в мире.

    Django часто называют фреймворком «для перфекционистов с дедлайнами». Он следует принципу «Batteries Included» (батарейки в комплекте), предоставляя разработчику готовые инструменты для работы с базами данных, аутентификацией пользователей, административной панелью и многим другим прямо «из коробки».

    Подготовка рабочего окружения

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

    Зачем нужно виртуальное окружение?

    Представьте, что вы работаете над двумя проектами: Проект А требует Django версии 2.2, а Проект Б — Django версии 5.0. Если вы установите Django глобально на свой компьютер, возникнет конфликт версий. Виртуальное окружение (Virtual Environment) создает изолированное пространство для каждого проекта, где хранятся только нужные ему библиотеки.

    Создание и активация

    В Python (начиная с версии 3.3) модуль для создания виртуальных окружений встроен в язык. Откройте терминал (командную строку) и выполните следующие действия:

  • Создайте папку для вашего проекта и перейдите в нее:
  • Создайте виртуальное окружение. Мы назовем его venv:
  • Примечание: В некоторых системах Linux/macOS может потребоваться команда python3 вместо python.

  • Активируйте окружение:
  • * Windows: * macOS / Linux:

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

    Установка Django и создание проекта

    Теперь, когда окружение активно, мы можем установить сам фреймворк. Используем для этого пакетный менеджер pip.

    Чтобы убедиться, что установка прошла успешно, можно проверить версию:

    Структура Django-проекта

    В терминологии Django существует четкое разделение между Проектом (Project) и Приложением (App). Это часто сбивает с толку новичков.

    * Проект — это глобальная конфигурация вашего веб-сайта. Это «контейнер», который содержит настройки базы данных, общие URL-адреса и список подключенных приложений. * Приложение — это модуль, выполняющий конкретную задачу (например, модуль блога, модуль форума, модуль опросов). Один проект может состоять из множества приложений, и одно приложение может использоваться в разных проектах.

    Создадим наш первый проект с именем config (частая практика называть корневую папку конфигурации config, core или именем сайта):

    Обратите внимание на точку . в конце команды. Она говорит Django создать проект в текущей папке, а не создавать новую вложенную папку.

    После выполнения команды вы увидите следующую структуру файлов:

    Разберем назначение ключевых файлов:

    * manage.py: Утилита командной строки для взаимодействия с проектом. Через нее мы будем запускать сервер, создавать миграции базы данных и создавать приложения. * settings.py: Главный пульт управления. Здесь настраиваются подключение к БД, часовой пояс, языковые настройки, список установленных приложений и параметры безопасности. * urls.py: «Диспетчер» вашего сайта. Этот файл отвечает за маршрутизацию — он решает, какую функцию вызвать, когда пользователь переходит по адресу google.com/search или google.com/mail. * wsgi.py / asgi.py: Точки входа для веб-серверов при развертывании проекта в продакшн (deploy).

    Архитектура MVT (Model-View-Template)

    Большинство веб-фреймворков используют архитектуру MVC (Model-View-Controller). Django использует слегка измененную концепцию, которая называется MVT.

    Понимание этой схемы — ключ к пониманию всего Django.

    !Схема обработки запроса в архитектуре MVT: от URL через Представление к Модели и Шаблону

    1. Model (Модель)

    Модель — это слой работы с данными. В Django вам редко придется писать чистый SQL-код. Вместо этого вы описываете структуру данных с помощью классов Python (вспоминаем ООП из прошлой лекции).

    Модель определяет: * Какие поля есть у таблицы (имя, дата, цена). * Как данные ведут себя (методы модели).

    Django автоматически превращает эти классы в таблицы базы данных. Этот механизм называется ORM (Object-Relational Mapping).

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

    Здесь часто возникает путаница. В классическом MVC «View» — это то, что видит пользователь. В Django View — это бизнес-логика.

    Представление (View) — это функция или класс, который:

  • Получает запрос от пользователя.
  • Обращается к Модели, чтобы получить нужные данные из базы.
  • Обрабатывает эти данные.
  • Передает данные в Шаблон.
  • Возвращает готовый ответ (страницу) пользователю.
  • > В терминологии Django: View — это то, что думает, а не то, что показывает.

    3. Template (Шаблон)

    Шаблон — это слой отображения. Это обычные HTML-файлы, в которые встроены специальные конструкции языка шаблонов Django (Django Template Language — DTL). Шаблоны отвечают за то, как данные будут выглядеть в браузере пользователя.

    Сравнение MVC и MVT

    | Концепция | MVC (Классика) | Django MVT | | :--- | :--- | :--- | | Данные | Model | Model | | Логика | Controller | View | | Отображение | View | Template |

    Фактически, роль «Контроллера» берет на себя сам фреймворк Django (обрабатывая URL и вызывая нужную View), поэтому разработчик фокусируется на Моделях, Представлениях и Шаблонах.

    Первый запуск сервера

    Давайте проверим, работает ли наш проект. Django имеет встроенный веб-сервер для разработки, который позволяет видеть изменения в коде без необходимости полной перезагрузки сложных систем.

    В терминале, находясь в папке с файлом manage.py, выполните:

    Вы увидите вывод, похожий на этот:

    Теперь откройте браузер и перейдите по адресу http://127.0.0.1:8000/. Если вы видите страницу с ракетой и надписью «The install worked successfully! Congratulations!», значит, вы все сделали правильно.

    Создание приложения (App)

    Как мы обсуждали выше, функционал сайта разбивается на приложения. Давайте создадим приложение для блога.

    Остановите сервер (нажмите Ctrl+C в терминале) и выполните команду:

    Появится новая папка blog со следующей структурой:

    Регистрация приложения

    Создать приложение недостаточно — нужно «сообщить» проекту о его существовании. Для этого нужно открыть файл config/settings.py, найти список INSTALLED_APPS и добавить туда наше новое приложение:

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

    Заключение

    Сегодня мы сделали первый шаг в мир профессиональной веб-разработки:

  • Настроили изолированное виртуальное окружение.
  • Установили Django и создали структуру проекта.
  • Разобрали архитектуру MVT, поняв, как разделяются данные, логика и отображение.
  • Запустили сервер разработки и создали первое приложение.
  • В следующей статье мы углубимся в букву M из аббревиатуры MVT. Мы спроектируем базу данных для нашего блога, научимся создавать модели и работать с миграциями, используя всю мощь ООП в Python.

    До встречи в следующем уроке!

    3. Модели данных и ORM: проектирование базы данных и миграции

    Модели данных и ORM: проектирование базы данных и миграции

    Добро пожаловать обратно! В предыдущей статье мы настроили окружение, создали проект Django и познакомились с архитектурой MVT (Model-View-Template). Мы узнали, что Model (Модель) отвечает за данные. Сегодня мы погрузимся в этот слой, чтобы спроектировать базу данных для нашего блога.

    Работа с базами данных часто пугает новичков необходимостью учить язык SQL (Structured Query Language). Однако Django предлагает элегантное решение, которое позволяет работать с базой данных, используя только знакомый вам синтаксис Python. Это решение называется ORM.

    Что такое ORM?

    ORM (Object-Relational Mapping) — это технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования. Проще говоря, ORM — это «переводчик» между миром объектов Python и миром реляционных таблиц SQL.

    !Визуализация того, как ORM транслирует классы Python в таблицы базы данных и обратно

    Благодаря ORM:

  • Вам не нужно писать SQL-запросы вручную (хотя знать SQL полезно).
  • Вы работаете с данными как с обычными объектами Python.
  • Вы можете легко сменить базу данных (например, с SQLite на PostgreSQL), изменив всего одну строчку в настройках, не переписывая код приложения.
  • Проектирование модели блога

    Давайте вспомним, что мы создали приложение blog. Откройте файл blog/models.py. Сейчас он почти пуст. Наша задача — описать структуру поста в блоге.

    Любая модель в Django — это класс, который наследуется от django.db.models.Model. Атрибуты этого класса соответствуют полям в таблице базы данных.

    Для нашего блога посту необходимы следующие данные: * Заголовок * Текст статьи * Дата публикации * Автор

    Напишем код модели:

    Разбор полей модели

    Каждое поле — это экземпляр соответствующего класса из django.db.models.

  • CharField: Поле для хранения строк ограниченной длины. Обязательный аргумент max_length указывает максимальное количество символов. Идеально подходит для заголовков.
  • TextField: Поле для хранения текста неограниченной длины. Подходит для основного содержания статьи.
  • DateTimeField: Хранит дату и время. Аргумент auto_now_add=True означает, что при создании новой записи Django автоматически подставит текущее время. Это очень удобно, так как нам не нужно указывать дату вручную.
  • ForeignKey: Это поле создает связь «Один-ко-Многим». Один пользователь может написать много постов, но у каждого поста только один автор.
  • * User — модель, с которой мы связываемся. * on_delete=models.CASCADE — инструкция, что делать с постами, если пользователь будет удален. CASCADE означает, что если удалить автора, все его посты тоже удалятся.

    Магический метод __str__

    Мы также добавили метод __str__. Как вы помните из урока по ООП, этот метод отвечает за строковое представление объекта. Если мы не добавим его, то в административной панели Django наши посты будут называться безлико: Post object (1), Post object (2). С этим методом они будут отображаться красивыми заголовками.

    Миграции: от кода к базе данных

    Мы написали код модели, но база данных об этом еще не знает. Таблицы в базе данных не создаются автоматически при сохранении файла models.py. Для внесения изменений в структуру БД в Django используется механизм миграций.

    Процесс работы с миграциями состоит из двух шагов:

  • Создание миграции (makemigrations): Django анализирует ваши модели и создает файл-инструкцию (чертеж), описывающий, какие изменения нужно внести в базу.
  • Применение миграции (migrate): Django берет этот файл-инструкцию и выполняет соответствующие SQL-команды в базе данных.
  • !Двухэтапный процесс обновления базы данных в Django

    Практика

    Убедитесь, что ваше виртуальное окружение активировано, и выполните в терминале:

    Вы должны увидеть вывод:

    Django создал файл blog/migrations/0001_initial.py. Вы можете открыть его и посмотреть — это обычный Python-код, описывающий создание таблицы.

    Теперь применим эти изменения:

    Вы увидите список примененных миграций. Теперь в вашей базе данных (по умолчанию это файл db.sqlite3) создана таблица для хранения постов.

    > Важно: Команду makemigrations нужно выполнять каждый раз, когда вы меняете структуру моделей (добавляете поля, удаляете их или меняете их параметры). Команду migrate нужно выполнять, чтобы применить эти изменения.

    Django ORM в действии: Shell

    У нас есть таблица, но она пуста. Мы еще не создали интерфейс для добавления постов, но мы можем воспользоваться консолью Django (shell) для взаимодействия с базой данных напрямую через Python.

    Запустите интерактивную консоль:

    1. Создание объектов (INSERT)

    Сначала нам нужно создать пользователя, так как поле author является обязательным. Затем мы создадим пост.

    Метод .objects.create() создает объект и сразу сохраняет его в базу данных.

    2. Получение всех объектов (SELECT *)

    Чтобы получить все записи из таблицы, используется метод all():

    Обратите внимание: вывелось название поста, потому что мы определили метод __str__.

    3. Фильтрация (WHERE)

    Мы можем искать посты по определенным критериям с помощью filter() и get().

    * filter() возвращает список (QuerySet) объектов, подходящих под условие. * get() возвращает один объект и вызывает ошибку, если объект не найден или найдено больше одного.

    4. Обновление (UPDATE)

    Изменить запись очень просто: поменяйте атрибут объекта и вызовите метод save().

    5. Удаление (DELETE)

    Админка Django

    Работать через консоль полезно для понимания, но неудобно для наполнения контентом. Django предоставляет готовую административную панель.

    Чтобы наши модели появились в админке, их нужно зарегистрировать. Откройте файл blog/admin.py и добавьте:

    Теперь создайте суперпользователя (администратора сайта), чтобы войти в систему:

    Следуйте инструкциям в терминале (введите имя, email и пароль). После этого запустите сервер (python manage.py runserver), перейдите по адресу http://127.0.0.1:8000/admin/ и войдите под созданным аккаунтом. Вы увидите раздел Blog и сможете создавать, редактировать и удалять посты через удобный веб-интерфейс.

    Заключение

    Сегодня мы спроектировали «сердце» нашего приложения — базу данных. Мы:

  • Изучили, что такое ORM и почему это удобно.
  • Создали модель Post с различными типами полей.
  • Разобрали механизм миграций (makemigrations и migrate).
  • Научились выполнять базовые CRUD-операции (Create, Read, Update, Delete) через консоль Django.
  • Теперь у нас есть данные, но пользователи все еще не могут их видеть, кроме как через админку. В следующей статье мы займемся Представлениями (Views) и URL-адресами, чтобы научить наш сайт отображать статьи блога обычным посетителям.

    4. Логика приложения: маршрутизация URL, представления (Views) и шаблоны

    Логика приложения: маршрутизация URL, представления (Views) и шаблоны

    Приветствую вас, коллеги! Мы продолжаем наш курс по веб-разработке на Django. В прошлых лекциях мы заложили прочный фундамент: изучили язык Python, настроили окружение и спроектировали базу данных, наполнив её первыми записями через административную панель.

    Однако, на данный момент наш сайт похож на библиотеку, в которую пускают только библиотекаря (администратора). Обычные посетители не видят ни списка статей, ни их содержания. Сегодня мы это исправим. Мы свяжем данные, которые хранятся в моделях, с пользовательским интерфейсом.

    Для этого нам предстоит освоить три ключевых компонента Django, работающих в связке: URL-маршрутизацию, Представления (Views) и Шаблоны (Templates).

    Жизненный цикл запроса

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

    !Схематичное изображение обработки запроса: от URL к Представлению, затем к Модели и Шаблону, и обратно к пользователю.

  • URL (Uniform Resource Locator): Пользователь запрашивает страницу (например, /blog/). Django должен понять, какую функцию запустить для этого адреса.
  • View (Представление): Функция-контроллер получает запрос, обращается к базе данных за статьями и выбирает нужный HTML-шаблон.
  • Template (Шаблон): HTML-файл получает данные от View и генерирует итоговую страницу, подставляя заголовки и тексты в нужные места.
  • Маршрутизация URL

    В любом Django-проекте есть «главный диспетчер» — файл urls.py в папке конфигурации проекта (в нашем случае config/urls.py). Его задача — перенаправлять запросы в соответствующие приложения.

    Подключение URL-адресов приложения

    Хорошей практикой считается не писать все маршруты в одном файле, а создавать для каждого приложения свой собственный urls.py. Это делает приложения переносимыми.

    Откройте файл config/urls.py и используйте функцию include, чтобы подключить маршруты нашего блога:

    Теперь создайте новый файл urls.py внутри папки вашего приложения blog/. Пока оставим его пустым, но подготовим структуру:

    Представления (Views)

    Представление — это место, где принимаются решения. В Django представления могут быть написаны как функции (Function-Based Views — FBV) или как классы (Class-Based Views — CBV). Для начала мы будем использовать функции, так как они более наглядны и понятны для обучения.

    Откройте файл blog/views.py. Наша цель — создать функцию, которая достанет все посты из базы данных и отдаст их шаблону.

    Разберем аргументы функции render: * request: Объект, содержащий всю информацию о запросе пользователя (браузер, IP, данные формы и т.д.). * 'blog/post_list.html': Путь к шаблону, который мы сейчас создадим. * {'posts': posts}: Словарь контекста. Ключ 'posts' — это имя переменной, которое будет доступно в шаблоне, а значение posts — это данные из нашей базы.

    Теперь вернемся в blog/urls.py и свяжем маршрут с этой функцией:

    Параметр name='post_list' позволяет нам ссылаться на этот URL по имени в любой части кода, что очень удобно, если сам адрес страницы в будущем изменится.

    Шаблоны (Templates)

    Django ищет шаблоны в папке templates внутри каждого приложения. Однако, чтобы избежать конфликтов имен (если у вас будет два приложения с файлом index.html), принято создавать вложенную папку с именем приложения.

    Создайте следующую структуру папок внутри blog/: blog/templates/blog/

    Внутри этой папки создайте файл post_list.html.

    Язык шаблонов Django (DTL)

    HTML — это статический язык разметки. Чтобы сделать его динамическим (вставить данные из Python), Django использует свой язык шаблонов. Он похож на HTML, но с «магическими» вставками.

    Основные конструкции: * {{ variable }} — двойные фигурные скобки выводят значение переменной. * {% tag %} — скобка с процентом используется для логики (циклы, условия).

    Напишем код для post_list.html:

    Обратите внимание на цикл {% for post in posts %}. Он работает точно так же, как цикл for в Python, перебирая список постов, который мы передали из views.py.

    Запустите сервер (python manage.py runserver) и зайдите на главную страницу. Вы должны увидеть список статей, которые вы создали ранее в админке!

    Динамические URL и детальная страница

    Список статей — это хорошо, но обычно мы хотим кликнуть на заголовок и прочитать статью целиком на отдельной странице. Для этого нам нужен уникальный адрес для каждого поста, например: /post/1/, /post/2/ и так далее.

    Настройка URL

    В blog/urls.py добавим новый маршрут:

    Конструкция <int:pk> — это конвертер пути. Она говорит Django: «Если в адресе после post/ идет целое число, поймай его и положи в переменную pk (Primary Key)». Это число будет передано в функцию представления.

    Создание View для одной статьи

    В blog/views.py добавим новую функцию. Нам также понадобится специальная функция get_object_or_404, которая вернет ошибку «Страница не найдена», если пользователь запросит несуществующий ID поста.

    Шаблон детальной страницы

    Создайте файл blog/templates/blog/post_detail.html:

    Ссылка на детальную страницу

    Теперь нужно изменить post_list.html, чтобы заголовки стали ссылками. Мы используем тег {% url %}, чтобы Django сам сгенерировал правильную ссылку.

    Замените строку с заголовком в post_list.html:

    Здесь 'post_detail' — это имя маршрута из urls.py, а pk=post.pk — аргумент, который мы передаем в URL.

    Наследование шаблонов

    Вы могли заметить, что в обоих HTML-файлах мы повторяем структуру <html><head>.... Если мы захотим подключить CSS-стили или изменить заголовок сайта, нам придется править каждый файл. Это нарушает принцип DRY (Don't Repeat Yourself).

    Django позволяет использовать наследование шаблонов.

    Создайте файл blog/templates/blog/base.html. Это будет наш «скелет»:

    Тег {% block content %} определяет место, куда дочерние шаблоны будут вставлять свой контент.

    Теперь перепишем post_list.html, убрав всё лишнее:

    Сделайте то же самое для post_detail.html. Теперь, если вы захотите добавить меню или футер, вам нужно будет изменить только base.html.

    Заключение

    Сегодня мы замкнули круг архитектуры MVT. Мы научились:

  • Настраивать URL-маршруты и использовать динамические параметры.
  • Писать Представления (Views), которые запрашивают данные из БД.
  • Использовать Шаблоны для отображения данных и применять наследование для чистоты кода.
  • Теперь у вас есть полноценный работающий сайт, по которому можно переходить по ссылкам. В следующей статье мы займемся визуальной составляющей: подключим CSS, статические файлы и сделаем наш блог красивым с помощью Bootstrap.

    До встречи на следующем уроке!

    5. Работа с формами, аутентификация пользователей и админ-панель

    Работа с формами, аутентификация пользователей и админ-панель

    Приветствую вас, будущие веб-разработчики! Мы продолжаем наш курс по Django. В предыдущих статьях мы проделали огромный путь: настроили проект, спроектировали базу данных и научились отображать статьи блога. Однако наш сайт всё ещё работает в режиме «только для чтения». Обычный пользователь не может написать статью, а администратор вынужден использовать стандартную админку для управления контентом.

    Сегодня мы превратим наш статический каталог статей в полноценное веб-приложение. Мы разберем три важнейшие темы:

  • Формы Django: как безопасно принимать данные от пользователей.
  • Аутентификация: как реализовать вход и выход из системы.
  • Настройка админ-панели: как сделать интерфейс администратора удобным и функциональным.
  • Формы в Django

    Работа с HTML-формами вручную — занятие утомительное и небезопасное. Вам нужно не только нарисовать поля <input>, но и проверить данные на сервере, обработать ошибки, защититься от хакерских атак и сохранить данные в базу. Django берет эту рутину на себя.

    ModelForm: Связь формы и модели

    В Django есть два типа форм: Form (обычная форма) и ModelForm (форма, привязанная к модели). Поскольку мы хотим создавать объекты модели Post, нам идеально подойдет второй вариант.

    Создайте новый файл forms.py внутри папки вашего приложения blog/.

    Что здесь происходит? * Мы создаем класс PostForm, наследуясь от forms.ModelForm. * В классе Meta мы указываем, какую модель использовать (Post) и какие поля должны быть в форме (title и content). * Обратите внимание: мы не включили поле author и created_at. Дата заполнится автоматически, а автора мы подставим программно (текущего залогиненного пользователя).

    !Диаграмма процесса обработки формы: ввод, валидация, сохранение или возврат ошибок

    Представление (View) для создания поста

    Теперь нам нужна логика, которая покажет форму и обработает отправленные данные. Откройте blog/views.py и добавьте новую функцию post_new.

    Разберем ключевые моменты:

  • request.method == "POST": Мы проверяем, пришли ли данные. Если да — обрабатываем их. Если нет (пользователь только зашел на страницу) — создаем пустую форму.
  • form.is_valid(): Django автоматически проверяет, заполнены ли обязательные поля и не превышена ли длина заголовка.
  • commit=False: Это важный трюк. Мы говорим: «Создай объект поста, но пока не сохраняй его в базу». Это позволяет нам добавить недостающие данные (в данном случае — автора request.user) перед финальным сохранением.
  • Шаблон для формы

    Создайте файл blog/templates/blog/post_edit.html:

    * {% csrf_token %}: Это защита от межсайтовой подделки запроса (Cross-Site Request Forgery). Без этого тега Django не примет форму. * {{ form.as_p }}: Магическая команда, которая превращает наш класс Python в готовый HTML-код, оборачивая каждое поле в тег параграфа <p>.

    Не забудьте добавить маршрут в blog/urls.py:

    Аутентификация пользователей

    Сейчас, если вы попробуете создать пост, вы можете столкнуться с ошибкой, если не вошли в систему (так как request.user будет анонимным). Django следует философии «Batteries Included» (Батарейки в комплекте), поэтому система аутентификации уже встроена в фреймворк.

    Настройка URL для входа

    В файле конфигурации проекта config/urls.py добавьте одну строку:

    Это подключает готовые маршруты для входа, выхода и смены пароля.

    Шаблон входа

    По умолчанию Django ищет шаблон входа по адресу registration/login.html. Создайте папку templates в корне проекта (рядом с manage.py), внутри нее папку registration, и файл login.html.

    Чтобы Django увидел эту папку, нужно подправить settings.py. Найдите TEMPLATES и добавьте 'DIRS': [BASE_DIR / 'templates'],.

    Пример registration/login.html:

    Также в settings.py нужно указать, куда перенаправлять пользователя после успешного входа и выхода:

    Защита представлений

    Мы не хотим, чтобы анонимные пользователи могли создавать посты. Для этого используем декоратор @login_required.

    В blog/views.py:

    Теперь, если незарегистрированный пользователь попытается зайти на /post/new/, Django автоматически перенаправит его на страницу входа.

    Обновление базового шаблона

    Давайте добавим ссылки на вход и выход в наше меню. Откройте blog/templates/blog/base.html:

    Обратите внимание: начиная с Django 5.0, выход из системы рекомендуется делать через POST-запрос (форму), а не через обычную ссылку, ради безопасности.

    Улучшение Админ-панели

    Мы уже пользовались админкой, но она выглядит довольно базово. Давайте настроим её, чтобы управлять большим количеством статей было удобнее.

    Откройте blog/admin.py. Ранее мы писали просто admin.site.register(Post). Теперь мы создадим класс конфигурации.

    Разбор опций

  • list_display: Вместо того чтобы видеть просто Post object, мы увидим таблицу с заголовком, автором и датой.
  • list_filter: Добавляет боковую панель, где можно в один клик отфильтровать статьи за "Сегодня", "Прошлые 7 дней" или по конкретному автору.
  • search_fields: Появляется строка поиска. Django будет искать введенный текст в заголовке и тексте статьи.
  • !Интерфейс админ-панели после применения настроек PostAdmin

    Заключение

    Поздравляю! Теперь ваш проект похож на настоящий сайт.

    Мы научились: * Использовать ModelForm для быстрого создания форм, связанных с базой данных. * Обрабатывать POST-запросы во views и сохранять данные. * Настраивать аутентификацию и защищать страницы от неавторизованного доступа. * Кастомизировать админ-панель для удобной работы контент-менеджера.

    Теперь вы можете регистрировать пользователей (через админку), входить под ними на сайт и писать статьи прямо из интерфейса блога. В следующем уроке мы займемся тем, чтобы наш сайт выглядел профессионально — подключим CSS-фреймворк Bootstrap и статические файлы.

    До встречи!