Как я могу реализовать систему 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>
Вернуться на верх