Исключение Значение: Профиль, соответствующий запросу, не существует
Я автоматически создал профиль с сигналами при создании пользователя. В этом профиле можно добавлять последователей в поле 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)