Страница не найдена (404) Ни один x не соответствует заданному запросу
Я не уверен, почему я не могу получить пк, который я думаю, что это проблема здесь. Я пытаюсь сделать функцию like для модели продукта, при like страница обновляется и показывается результат, но он не сохраняет like и выдает ошибку Page not found (404) No Product matches the given query.
Моя модель:
class Product(models.Model):
author = models.ForeignKey(User, default=None, on_delete=models.CASCADE)
title = models.CharField(max_length=120, unique=True)
likes = models.ManyToManyField(User, related_name='like')
...
def number_of_likes(self):
return self.likes.count()
Мои взгляды:
class ProductDetailView(DetailView):
model = Product
template_name = 'services/product_detail.html'
def get_context_data(self, **kwargs):
data = super().get_context_data(**kwargs)
likes_connected = get_object_or_404(Product, id=self.kwargs['pk'])
liked = False
if likes_connected.likes.filter(id=self.request.user.id).exists():
liked = True
data['number_of_likes'] = likes_connected.number_of_likes()
data['post_is_liked'] = liked
return data
def ProductLike(request, pk):
post = get_object_or_404(Product, id=request.POST.get('product_id'))
if post.likes.filter(id=request.user.id).exists():
post.likes.remove(request.user)
else:
post.likes.add(request.user)
return HttpResponseRedirect(reverse('product-detail', args=[str(pk)]))
Мои ссылки:
path('product/<int:pk>/', ProductDetailView.as_view(), name='product-detail'),
path('product-like/<int:pk>/', ProductLike, name="product_like"),
Мой шаблон:
{% if user.is_authenticated %}
<form action="{% url 'product_like' object.id %}" method="POST">
{% csrf_token %}
{% if post_is_liked %}
<button type="submit" name="blogpost_id" value="{{object.id}}" >Unlike</button>
{% else %}
<button type="submit" name="blogpost_id" value="{{object.id}}">Like</button>
{% endif %}
</form>
{% else %}
<a href="{% url 'login' %}?next={{request.path}}">Log in to like this article!</a><br>
{% endif %}
<strong>{{ number_of_likes }} Like{{ number_of_likes|pluralize }}</strong>
Несколько вещей, которые могут вызывать у вас проблемы:
В вашем редиректе для ProductLike вы используете args
return HttpResponseRedirect(reverse('product-detail', args=[str(pk)]))
Но когда вы возвращаетесь к представлению, вы ищете kwargs
likes_connected = get_object_or_404(Product, id=self.kwargs['pk'])
Попробуйте использовать kwargs в вашем перенаправлении
return HttpResponseRedirect(reverse('product-detail', kwargs={'pk': pk}))
Также, в вашем представлении ProductLike вы ссылаетесь на request.POST.get('product_id'))
Однако вы не отправляете никаких полей с именем product_id
. Похоже, что форма отправляет blogpost_id
, поэтому поиск в представлении всегда будет 404.