Исключение Значение: Профиль, соответствующий запросу, не существует

Я автоматически создал профиль с сигналами при создании пользователя. В этом профиле можно добавлять последователей в поле ManyToMany под названием followers. Но когда я пытаюсь использовать метод AddFollower или RemoveFollower, я получаю эту ошибку. Это происходит только с профилями, созданными автоматически с помощью сигналов, профили, созданные с помощью django admin, работают нормально. Буду благодарен за помощь!

Мой views.py

class AddFollower(ListView):
    def post(self, request, pk , *args, **kwargs ):
        profile = Profile.objects.get(pk=pk)
        profile.followers.add(self.request.user)
    
        return redirect('profile', username = profile.user.username)

class RemoveFollower(ListView):

    def post(self, request, pk , *args, **kwargs ):
        profile = Profile.objects.get(pk=pk)
        profile.followers.remove(self.request.user)

   
        return redirect('profile', username = profile.user.username)

Urls.py:

urlpatterns = [
    path('profile', profile,name='profile'),
    path('profile/<str:username>/', profile,name='profile'),
    path('add_follower/<int:pk>/', AddFollower.as_view(),name='add_follower'),
    path('remove_follower/<int:pk>/', RemoveFollower.as_view(),name='remove_follower'),
    path('all_followers/<int:pk>/', AllFollowers.as_view(), name='all_followers'),
    path('feed', Feed.as_view(),name='feed'),
    path('register', register, name='register'),
    path('login', LoginView.as_view(template_name='network_app/login.html'), name='login'),
    path('logout', LogoutView.as_view(template_name= 'network_app/logout.html'), name='logout'),
    path('create_post', CreatePost.as_view(), name='create_post' ),
    path('following_posts', FollowingPosts.as_view(), name= 'following_posts')   
    
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)


html:

{% if user.is_authenticated and user != current_user %}
    
    {% if is_following %}
    <h1>{{ is_following }}</h1>
    

    <form method="POST" action="{% url 'remove_follower' user.pk %}" >
    
    {% csrf_token %}
    
    <button type="submit">Unfollow</button> 

    </form>


    {% else %}
    <h1>{{ is_following }}</h1>

    
    <form method="POST" action="{% url 'add_follower' user.pk %}" >
    
    {% csrf_token %}
    <button type="submit">Follow</button>   

    </form>


    {% endif %}

{% endif %}

Профильная функция:

def profile (request, username=None):
    current_user = request.user
    user_a = User.objects.get(username = username)
    profile = Profile.objects.get(user = user_a)
    followers = profile.followers.all()
    number_of_followers = len(followers)
    
    if username and username != current_user.username:
        user_a = User.objects.get(username=username)
        posts = user_a.posts.all()

    else:
        user_a = current_user 
        posts = current_user.posts.all()
    is_following = set_is_following(followers, current_user)    

    context =  {'posts': posts, 'user':user_a, 
    'is_following':is_following,'profile':profile, 'current_user': current_user,
    }

    return render (request, 'network_app/profile.html', context  )   

signals.py:

@receiver (post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user = instance)

Модели профилей:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_img = models.ImageField(default='batman.png')
    followers = models.ManyToManyField(User,blank=True, related_name='followers')

    def __str__(self):
        return f'{self.user.username} profile'

Шаблон ошибки выделяет его: profile = Profile.objects.get(pk=pk)

Потому что ваше значение pk находится в методе get, но вы пытаетесь использовать его в методе post. Вы можете получить доступ к нему из kwargs:

class AddFollower(ListView):
    def post(self, request, pk , *args, **kwargs ):
        profile = Profile.objects.get(pk=self.kwargs['pk'])
        profile.followers.add(self.request.user)
    
        return redirect('profile', username = profile.user.username)

class RemoveFollower(ListView):

    def post(self, request, pk , *args, **kwargs ):
        profile = Profile.objects.get(pk=self.kwargs['pk'])
        profile.followers.remove(self.request.user)

   
        return redirect('profile', username = profile.user.username)
Вернуться на верх