Финальное задание
Осталось добавить систему подписки на авторов и создать ленту их постов.
Задача знакомая: создайте модель, напишите view-функцию, добавьте в urls.py новые пути, подготовьте шаблоны.
Поехали.
Модель Follow должна иметь такие поля:
- user — ссылка на объект пользователя, который подписывается. Укажите имя связи:
related_name="follower" - author — ссылка на объект пользователя, на которого подписываются, имя связи пусть будет
related_name="following"
Напишите view-функцию страницы, куда будут выведены посты авторов, на которых подписан текущий пользователь.
Ещё две view-функции нужны для подписки на интересного автора и для того, чтобы отписаться от надоевшего графомана:
Скопировать кодPYTHON
@login_required
def follow_index(request):
return render(request, "follow.html", {...})
@login_required
def profile_follow(request, username):
pass
@login_required
def profile_unfollow(request, username):
pass
Добавьте необходимые адреса в posts/urls.py:
Скопировать кодPYTHON
urlpatterns = [
path("follow/", views.follow_index, name="follow_index"),
path("<str:username>/follow/", views.profile_follow, name="profile_follow"),
path("<str:username>/unfollow/", views.profile_unfollow, name="profile_unfollow"),
]
Теперь шаблоны.
Создайте шаблон follow.html, куда будут выводиться посты авторов, на которых подписан текущий пользователь. За образец можете взять шаблон index.html, только замените заголовок.
Добавьте в шаблоны index.html и follow.html виджет переключения лент menu.html:
Скопировать кодHTML
{% if user.is_authenticated %}
<div class="row">
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link {% if index %}active{% endif %}" href="{% url %}">Все авторы</a>
</li>
<li class="nav-item">
<a class="nav-link {% if follow %}active{% endif %}" href="/follow">Избранные авторы</a>
</li>
</ul>
</div>
{% endif %}
Код index.html:
Скопировать кодHTML
{% extends "base.html" %}
{% block title %}Последние обновления {% endblock %}
{% block content %}
<div class="container">
{% include "menu.html" with index=True %}
<h1>Последние обновления на сайте</h1>
{% for post in page %}
{% include "post_item.html" with post=post %}
{% endfor %}
{% if page.has_other_pages %}
{% include "paginator.html" with items=page paginator=paginator%}
{% endif %}
</div>
{% endblock %}
На странице профайла добавьте ссылку «Подписаться» в левое меню:
Скопировать кодHTML
<li class="list-group-item">
{% if following %}
<a class="btn btn-lg btn-light"
href="{% url 'profile_unfollow' profile.username %}" role="button">
Отписаться
</a>
{% else %}
<a class="btn btn-lg btn-primary"
href="{% url 'profile_follow' profile.username %}" role="button">
Подписаться
</a>
{% endif %}
</li>
Тестирование
Напишите тесты, проверяющие работу нового сервиса:
- Авторизованный пользователь может подписываться на других пользователей и удалять их из подписок.
- Новая запись пользователя появляется в ленте тех, кто на него подписан и не появляется в ленте тех, кто не подписан на него.
- Только авторизированный пользователь может комментировать посты.