Задание
Код-ревью
История
Аккаунт на github.com успешно привязан к вашему аккаунту. Теперь можно отправить задание на проверку.

Сообщества

Вы подошли к финальному проекту спринта.
На гитхабе вам стал доступен новый репозиторий — hw02_community. В нём лежат только тесты. Склонируйте его.
Затем перенесите файлы и директории проекта Yatube в папку этого репозитория (а не наоборот, это важно).
Структура файлов должна стать примерно такой: image
Не забудьте создать новое виртуальное окружение для этого проекта. Вы это уже делали в уроке «Подготовка окружения Django-проекта».

Автоматическая установка зависимостей и requirements.txt

Для работы любого проекта требуется определённое (иногда довольно большое) количество сторонних пакетов — модулей, библиотек или фреймворков. Пакеты, которые нужны для работы других пакетов, называются «зависимости». Их не включают в репозитории с проектами, и после клонирования чужого проекта разработчик самостоятельно устанавливает их.
Вычислять необходимые зависимости и затем устанавливать каждый пакет по отдельности? Нет, не таким должен быть Путь Настоящего Программиста — и разработчики автоматизировали процесс установки зависимостей проекта.
Вы уже видели в репозитории файл requirements.txt. В нём сохранён перечень зависимостей проекта. Имя requirements.txt не предустановлено, но традиционно этот файл называют именно так.
И теперь — главное: чтобы не устанавливать зависимости поштучно, можно запустить в консоли команду:
Скопировать кодBASH
$ pip install -r requirements.txt
По этой команде менеджер пакетов pip обратится к сайту pypi.org, скачает оттуда по списку последние версии пакетов и при этом постарается подобрать их так, чтобы они не конфликтовали друг с другом.

Откуда берётся requirements.txt

В этом задании вам не нужно генерировать requirements.txt, но всегда полезно знать, откуда берутся файлы.
Когда проект настроен и все пакеты установлены, по команде pip freeze > requirements.txt pip соберёт названия всех пакетов и запишет в файл, название которого указано в команде после символа >.

Тестирование Django-проектов

Осталось установить специализированный пакет для тестирования Django-проектов: pytest-django.
Скопировать кодBASH
$ pip install pytest-django
Запуск тестов не отличается от того, что вы делали в прошлом проекте. Инструкция выложена здесь.
Если вы сделали не всё, о чем мы вас просили в теме «Django: создаём приложение» — вернитесь и сделайте. А если всё готово — переходите к заданию.

А теперь — задание

Вы уже знаете достаточно, чтобы попробовать свои силы в развитии проекта. Ваша задача — создать сообщества для публикаций. Дайте блогеру возможность опубликовать пост не только у себя в ленте, но и выбрать группу, в которой появится этот пост. Сообщества создаются администрацией сайта, посетители не смогут их добавлять. При публикации записи автор может выбрать одно сообщество и отправить туда свой пост.
Сообщество должно иметь следующие свойства:
  • Имя (title).
  • Адрес (slug) — уникальный адрес группы, часть URL (например, для группы любителей котиков slug будет равен cats: group/cats).
  • Описание (description) — текст, который появится на странице сообщества.
Вам надо:
  • Создать модель сообщества с названием Group. Не забудьте указать в модели метод __str__, чтобы при печати объекта на экран выводилось поле title.
  • Добавить в модель Post свойство group, чтобы при добавлении новой записи можно было сослаться на сообщество (на модель Group). Указывать сообщество при публикации необязательно, поэтому в параметрах свойства group укажите blank=True, null=True.
  • Создать view-функцию group_posts, она должна возвращать страницу сообщества и выводить на ней дюжину новых записей. Адрес страницы сообщества должен быть /group/<slug>/. Если адрес сообщества не найден, выводите код ошибки 404.
  • Подготовить шаблон group.html, он будет передаваться в render() во view-функции group_posts()
Пост в сообществе — это просто пост, у которого в поле group указано, какому сообществу он принадлежит
Файл posts/views.py должен выглядеть примерно так:
Скопировать кодPYTHON
from django.shortcuts import render, get_object_or_404 from .models import Post, Group def index(request): # эта функция у вас уже есть # view-функция для страницы сообщества def group_posts(request, slug): # функция get_object_or_404 получает по заданным критериям объект из базы данных # или возвращает сообщение об ошибке, если объект не найден group = get_object_or_404(Group, slug=slug) # Метод .filter позволяет ограничить поиск по критериям. Это аналог добавления # условия WHERE group_id = {group_id} posts = Post.objects.filter(group=group).order_by("-pub_date")[:12] return render(request, "group.html", {"group": group, "posts": posts})
Обратите внимание на функцию get_object_or_404(), это удобный и простой инструмент. Функция ищет в базе объект модели, и если не находит — прерывает работу view-функции и возвращает страницу с ошибкой 404.
Создайте и настройте шаблон group.html в директории templates, передайте в него контекст, выведите переменные в нужные части шаблона.
После этого страница сообщества должна возвращаться пользователю примерно в таком виде:
Скопировать кодHTML
<!doctype html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <title>Записи сообщества Лeв Толстой | Yatube</title> </head> <body> <h1>Лeв Толстой</h1> <p> Цитаты Льва Толстого </p> <h3> Автор: Лев Толстой, дата публикации: 31 Jul 1854 </h3> <p>[Фокшаны.] Еще переходъ до Фокшанъ, во время котораго я ѣхалъ съ Монго. Человѣкъ пустой, но съ твердыми, хотя и ложными убѣжденіями. Генерал[у] по этому должно быть случаю, угодно было спрашивать о моемъ здоровьи. Свинья! К[о]вырялъ носъ и ничего не написалъ — вотъ 2 упрека за нын[ѣшній] день. Послѣдній упрекъ становится слишкомъ частъ, хотя походъ и можетъ служить въ немъ отчасти извиненіемъ. Отношенія мои съ товарищами становятся такъ пріятны, что мнѣ жалко бросить штабъ. Здоровье кажется (2) лучше.</p> <hr> <h3> Автор: Лев Толстой, дата публикации: 30 Jul 1854 </h3> <p>[Рымник.] Сдѣлалъ верхомъ переходъ до Рымника. [[5]] Старикъ все не кланяется мнѣ. Обѣ вещи эти злятъ меня. Съ встрѣчавшимися баши-бузуками велъ себя хорошо. Объяснился съ Крыжановскимъ. Онъ, не знаю зачѣмъ, совѣтуетъ мнѣ прикомандироваться къ казачьей батареѣ; совѣтъ, которому я не послѣдую. Желчно спорилъ вечеромъ съ Фриде и Бабарыкинымъ, ругалъ Сержпутовскому и ничего не сдѣлалъ, вотъ 3 упрека, которыя дѣлаю себѣ за нынѣшній день. (3)</p> <hr> <h3> Автор: Лев Толстой, дата публикации: 29 Jul 1854 </h3> <p>Исправленіе мое идетъ прекрасно. Я чувствую, какъ отношенія мои становятся пріятны и легки съ людьми всякаго рода, съ тѣхъ поръ какъ я рѣшился быть скромнымъ и убѣдился въ томъ, что казаться всегда величественнымъ и непогрѣшнымъ вовсе не есть необходимость. Я очень веселъ. И дай Богъ, какъ мнѣ кажется, — чтобы веселье это происходило отъ самаго меня; отъ желаній всѣмъ быть пріятнымъ, скромности, необидчивости и внимательности за вспышками. — Тогда бы я всегда былъ веселъ и почти всегда счастливъ. Утромъ рѣшилъ было сидѣть дома, позаниматься, но дѣло не пошло и не утерпѣлъ вечеромъ, чтобы не пойдти пошляться. Идя отъ ужина, мы съ Тишк[евичемъ] остановились у бардели и насъ накрылъ Крыжановскій, что, признаюсь, было мнѣ не совсѣмъ пріятно. Упрекаю себя за безхарактерность, что не высидѣлъ дома, и зa праздность цѣлаго дня. Это главный пунктъ. (2)</p> <hr> </body> </html>