Как я могу реализовать систему Follow/Unfollow с CBV в Django?
Я сделал много попыток создать следующую систему. Кто может подробно описать, как это реализовать? Мой код показывает много ошибок. В AddFollower() и Remove follower() я получаю профиль, на котором я нахожусь и текущий профиль (мой) и добавляю или удаляю в базу данных. Но эти функции не работают. Помогите найти решение, пожалуйста
urls.py
path('add-follower/<int:id>/', AddFollower.as_view(), name='add_follower'),
path('remove-follower/<int:id>/', RemoveFollower.as_view(), name='remove_follower')
views.py
class AddFollower(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
user = self.kwargs.get('user')
profile = Profile.objects.get(user=user)
profile.subscribers.add(request.user)
return redirect('user-posts', id=profile.id)
class RemoveFollower(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
user = self.kwargs.get('user')
profile = Profile.objects.get(user=user)
profile.subscribers.remove(request.user)
return redirect('user-posts', id=profile.id)
class GetUserProfile(ListView):
model = Question
template_name = 'blog/profile.html'
queryset = Question.objects.all()
def get_queryset(self):
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Question.objects.filter(user=user)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
user = get_object_or_404(User, username=self.kwargs.get('username'))
profile = Profile.objects.get(user=user)
followers = profile.subscribers.all()
if self.request.user in followers:
is_following = True
else:
is_following = False
context['question_count'] = Question.objects.filter(user=user)
context['post_count'] = Post.objects.filter(author=user)
context['answer_count'] = Answer.objects.filter(user=user)
context['profile_user'] = User.objects.get(username=user)
context['is_following'] = is_following
return context
profile.html
{% if profile_user.id == request.user.id %}
<div class="buttons mt-3">
<a class="btn btn-dark px-4 ms-3" href="{% url 'profile' %}">Редактировать</a>
</div>
{% else %}
{% if is_following %}
<form action="{% url 'remove_follower' user.id %}" method="POST">
{% csrf_token %}
<div class="buttons mt-3">
<button type="submit" class="btn btn-dark px-4 ms-3">Unfollow</button>
</div>
</form>
{% else %}
<form method="POST" action="{% url 'add_follower' user.id %}">
{% csrf_token %}
<div class="buttons mt-3">
<button type="submit" class="btn btn-dark px-4 ms-3">Follow</button>
</div>
</form>
{% endif %}
{% endif %}
Вы не приводите список ошибок. Сложно найти решение проблемы.
Но я вижу некоторые ошибки в вашем коде. В функции post вы обращаетесь к пользователю через user = self.kwargs.get('user'), но в url вы передали только параметр id, поэтому вы можете получить пользователя с помощью этой строки вместо предыдущей:
from django.shortcuts import get_object_or_404
class AddFollower(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
user = get_object_or_404(User, pk=kwargs.get('id'))
profile = Profile.objects.get(user=user)
profile.subscribers.add(request.user)
return redirect('user-posts', id=profile.id)
class RemoveFollower(LoginRequiredMixin, View):
def post(self, request, *args, **kwargs):
user = get_object_or_404(User, pk=kwargs.get('id'))
profile = Profile.objects.get(user=user)
profile.subscribers.remove(request.user)
return redirect('user-posts', id=profile.id)
Я не знаю, последние ли это ошибки. Пожалуйста, дайте нам более подробную информацию и сообщение об ошибках.
Итак, наконец-то я решил эту проблему. Проблема заключалась в том, что я передал неправильное имя пользователя в view. Я получал профиль вошедшего пользователя вместо текущего пользователя, поэтому я исправил это, добавив контекстные данные:
user = self.kwargs.get('username')
profile_user = User.objects.get(user=user)
<
<form method="POST" action="{% url 'add_follower' profile_user.username %}">
{% csrf_token %}
<div class="buttons mt-3">
<button type="submit" class="btn btn-dark px-4 ms-3">Follow</button>
</div>
</form>