Exception Value: Profile matching query does not exist
I have automatically created a profile with signals when a user is created. In this profile you can add followers in the ManyToMany field called followers. But when I try to use the AddFollower or RemoveFollower method I get this error. This only happens with profiles created automatically with signals, those created with the django admin work fine. I'd appreciate your help!
My 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 %}
Profile function:
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)
Profile Models:
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'
Error template highlights it: profile = Profile.objects.get(pk=pk)
It is because your pk value is in get
method but you are trying to use it in post
method. You can access it from 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)