Страница не найдена (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.

Вернуться на верх