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


Не забудьте создать новое виртуальное окружение для этого проекта. Вы это уже делали в уроке «Подготовка окружения 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 должен выглядеть примерно так:Скопировать кодPYTHONfrom 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>