🔥 Самостоятельная работа 2 — Блог#

Создайте новый Django-проект Blog и примените в нём навыки, полученные при разработке Learning Log: модели, миграции, административный интерфейс, формы, шаблоны, пользователей и разграничение доступа.

Постановка задачи#

Внутри проекта создайте приложение blogs и модель BlogPost. Через административный интерфейс добавьте несколько коротких публикаций. На домашней странице выведите все записи в хронологическом порядке.

Затем добавьте:

  • форму создания публикации;
  • форму редактирования публикации;
  • регистрацию пользователей;
  • вход и выход;
  • отображение имени вошедшего пользователя;
  • ограничение редактирования по автору;
  • оформление через django-bootstrap4.

Имена проекта и приложения#

Объект Имя
Каталог и Django-проект blog
Приложение публикаций blogs
Приложение пользователей users
Основная модель BlogPost

Базовая модель BlogPost#

Обязательные поля из задания:

Поле Тип Назначение
title CharField(max_length=200) Заголовок публикации
text TextField() Основной текст
date_added DateTimeField(auto_now_add=True) Дата публикации

Метод __str__() должен возвращать заголовок.

Зарегистрируйте модель в admin.py, создайте суперпользователя и добавьте через административный интерфейс не менее трёх разных публикаций.

Добавление автора#

После реализации пользователей добавьте к модели поле автора:

Поле Тип Назначение
owner ForeignKey к пользователю Автор публикации

Если записи уже существуют, при миграции назначьте им существующего пользователя. Это повторяет безопасный перенос данных, который выполнялся при добавлении владельца темы в Learning Log.

Административный интерфейс#

В административном интерфейсе должны быть доступны:

  • список публикаций;
  • заголовок;
  • автор;
  • дата добавления;
  • поиск по заголовку и тексту;
  • фильтр по дате или автору.

Настройка ModelAdmin оценивается как часть качества проекта.

Обязательные страницы#

Страница Пример URL Доступ
Главная со списком / Всем
Создание публикации /posts/new/ После входа
Редактирование /posts/<id>/edit/ Только автору
Вход /users/login/ Всем
Регистрация /users/register/ Всем
Выход /users/logout/ Только методом POST

Отдельная страница публикации /posts/<id>/ рекомендуется, но не является обязательной.

Главная страница#

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

BlogPost.objects.order_by('-date_added')

Для каждой записи покажите:

  • заголовок;
  • имя автора;
  • дату и время публикации;
  • текст или краткий фрагмент текста;
  • ссылку редактирования, если текущий пользователь является автором.

Если записей нет, выведите понятное сообщение вместо пустой страницы.

Формы создания и редактирования#

Создайте BlogPostForm на базе ModelForm. Пользователь должен редактировать только поля title и text.

Поля owner и date_added не включайте в форму. При создании публикации назначайте автора в представлении:

new_post = form.save(commit=False)
new_post.owner = request.user
new_post.save()

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

Регистрация и аутентификация#

Используйте встроенную систему пользователей Django.

Требования:

  • незарегистрированный посетитель видит ссылки входа и регистрации;
  • вошедший пользователь видит своё имя;
  • после регистрации пользователь автоматически входит в систему или перенаправляется на страницу входа;
  • создание и редактирование защищены login_required;
  • выход выполняется POST-формой с CSRF-токеном;
  • после входа пользователь возвращается на понятную страницу приложения.

Права доступа#

Все публикации являются публичными для чтения. Изменять публикацию может только её автор.

Получайте редактируемую запись вместе с проверкой автора:

post = get_object_or_404(BlogPost, id=post_id, owner=request.user)

Обязательное поведение:

  • анонимный пользователь не открывает форму создания;
  • пользователь не видит ссылку редактирования чужой записи;
  • ручной переход к URL редактирования чужой записи возвращает 404;
  • несуществующий ID возвращает 404, а не 500;
  • изменение скрытого поля или ручной POST не позволяет сменить автора.

Оформление через django-bootstrap4#

Используйте тот же пакет django-bootstrap4, который применялся в Learning Log. Для всех страниц проекта должен использоваться Bootstrap 4.

Установите пакет в активированном виртуальном окружении:

pip install django-bootstrap4

Добавьте приложение в INSTALLED_APPS:

'bootstrap4',

В базовом шаблоне загрузите теги и ресурсы Bootstrap 4:

{% load bootstrap4 %}
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}

Формы публикаций, входа и регистрации оформляйте тегами bootstrap_form, bootstrap_button или классами Bootstrap 4, использованными в Learning Log.

Интерфейс должен содержать:

  • общую панель навигации;
  • название блога со ссылкой на главную;
  • имя текущего пользователя;
  • ссылки входа и регистрации;
  • безопасную кнопку выхода;
  • кнопку создания публикации для вошедшего пользователя;
  • карточки публикаций;
  • единый стиль форм и сообщений об ошибках;
  • адаптивное отображение на телефоне.

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

Этапы выполнения#

  1. Создайте проект blog и приложение blogs.
  2. Опишите базовую модель BlogPost и выполните миграции.
  3. Настройте административный интерфейс и создайте суперпользователя.
  4. Добавьте через администратора не менее трёх публикаций.
  5. Реализуйте главную страницу со всеми публикациями.
  6. Создайте BlogPostForm и страницу добавления.
  7. Добавьте страницу редактирования.
  8. Реализуйте приложение users, регистрацию, вход и POST-выход.
  9. Добавьте автора публикации и выполните миграцию существующих данных.
  10. Ограничьте изменение публикаций по автору.
  11. Подключите django-bootstrap4 и добавьте адаптивное оформление.
  12. Проверьте проект с двумя пользователями и напишите тесты.

После каждого этапа запускайте:

python manage.py check
python manage.py test

Сценарии приёмки#

№ Действие Ожидаемый результат
1 Открыть главную без входа Видны все публикации, но нет формы создания
2 Открыть пустой блог Показано сообщение об отсутствии записей
3 Зарегистрироваться Создан пользователь, отображается его имя
4 Создать публикацию Автор назначен автоматически
5 Перезагрузить главную Новая публикация показана первой
6 Отредактировать свою запись Изменения сохраняются
7 Войти вторым пользователем Чужая запись доступна для чтения
8 Открыть редактирование чужой записи Ответ 404
9 Подставить отсутствующий ID Ответ 404, сервер продолжает работать
10 Выйти через POST-форму Сеанс завершён
11 Открыть URL выхода методом GET Выход не выполняется
12 Открыть сайт на телефоне Навигация, карточки и формы читаемы

Обязательные автоматические тесты#

Добавьте тесты, которые проверяют:

  • порядок публикаций на главной странице;
  • отображение пустого состояния;
  • доступность чтения без входа;
  • запрет создания без входа;
  • автоматическое назначение автора;
  • возможность автора редактировать публикацию;
  • запрет редактирования чужой публикации;
  • ответ 404 для отсутствующего ID;
  • корректную регистрацию;
  • выход только через POST.

Дополнительные задания#

После обязательной части можно реализовать:

  • отдельную страницу публикации;
  • удаление записи автором с подтверждением;
  • черновики и публикацию по кнопке;
  • категории и теги;
  • комментарии;
  • поиск;
  • пагинацию;
  • загрузку обложки;
  • человекочитаемые URL на основе slug.

Если добавляются комментарии или изображения, для них также нужны проверки владельца, типа файла и допустимого размера.

Что сдавать#

Для запуска на учебном сервере используйте раздел «Деплой на сервер»: создайте отдельный проект и замените learning_log.wsgi:application на blog.wsgi:application в Dockerfile и compose.yaml.

Передайте две ссылки:

  1. На публичный репозиторий проекта в GitHub.
  2. На развёрнутое приложение, которое открывается по IP-адресу учебного сервера и выделенному порту.

Публикация приложения во внешней сети через домен и HTTPS не обязательна. Преподаватель может настроить её через свой шлюз по запросу.

В репозитории обязательно должны находиться:

  • README.md с понятной инструкцией по развёртыванию проекта на сервере;
  • compose.yaml для быстрого запуска проекта командой docker compose up -d --build;
  • все исходные файлы, зависимости и миграции, необходимые для запуска.

Файл .env, секретные ключи, пароли, база с реальными данными и виртуальное окружение в GitHub не загружайте. Перечень необходимых переменных окружения опишите в README.md.