🔥 Самостоятельная работа 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.
Интерфейс должен содержать:
- общую панель навигации;
- название блога со ссылкой на главную;
- имя текущего пользователя;
- ссылки входа и регистрации;
- безопасную кнопку выхода;
- кнопку создания публикации для вошедшего пользователя;
- карточки публикаций;
- единый стиль форм и сообщений об ошибках;
- адаптивное отображение на телефоне.
Длинный текст не должен ломать ширину страницы. Даты должны выводиться в понятном формате.
Этапы выполнения#
- Создайте проект
blogи приложениеblogs. - Опишите базовую модель
BlogPostи выполните миграции. - Настройте административный интерфейс и создайте суперпользователя.
- Добавьте через администратора не менее трёх публикаций.
- Реализуйте главную страницу со всеми публикациями.
- Создайте
BlogPostFormи страницу добавления. - Добавьте страницу редактирования.
- Реализуйте приложение
users, регистрацию, вход и POST-выход. - Добавьте автора публикации и выполните миграцию существующих данных.
- Ограничьте изменение публикаций по автору.
- Подключите
django-bootstrap4и добавьте адаптивное оформление. - Проверьте проект с двумя пользователями и напишите тесты.
После каждого этапа запускайте:
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.
Передайте две ссылки:
- На публичный репозиторий проекта в GitHub.
- На развёрнутое приложение, которое открывается по IP-адресу учебного сервера и выделенному порту.
Публикация приложения во внешней сети через домен и HTTPS не обязательна. Преподаватель может настроить её через свой шлюз по запросу.
В репозитории обязательно должны находиться:
README.mdс понятной инструкцией по развёртыванию проекта на сервере;compose.yamlдля быстрого запуска проекта командойdocker compose up -d --build;- все исходные файлы, зависимости и миграции, необходимые для запуска.
Файл .env, секретные ключи, пароли, база с реальными данными и виртуальное окружение в GitHub не загружайте. Перечень необходимых переменных окружения опишите в README.md.