Как я могу устранить ошибку 404 на странице продукта?

Я делаю сайт с магазином. Он выглядит следующим образом: магазин -> каталог -> все товары -> один товар. Когда я перехожу на страницу с одним товаром, я получаю 404 ошибку.

views.py

def product_view(request: WSGIRequest, product_slug: str):
try:
    product = (
        Product.objects
            .prefetch_related('productimage_set')
            .filter(slug=product_slug)
            .first()
    )
    is_in_cart = CartProduct.objects.filter(
       product=product,
       cart__user=request.user,
       cart__active=True).first()
    context = {
      'product': product,
    # 'is_in_cart': is_in_cart,
   }
except Product.DoesNotExist:
   raise Http404
return render(
   request, 'shop/product.html',
   context)

def category_list(request: WSGIRequest, category_slug: str):
try:
    category: Category = (
        Category.objects
            .prefetch_related("product_set")
            .get(slug=category_slug))
except Category.DoesNotExist:
   raise Http404
return render(
   request, 'shop/category.html',
   {"category": category})

urls.py

path('', views.CatalogList.as_view(), name='shop'),
path('<slug:category_slug>/', views.category_list, name='category'),
path('<slug:product_slug>/', views.product_view, name='product')

базовые урлы

path('admin/', admin.site.urls),
path('shop/', include('page.shop.urls')),

шаблоны

{% if product.productimage_set.all %}
{% for image in product.productimage_set.all %}
    <div>
        <img src="{{ image.image.url }}" alt="{{ product.name }}">
    </div>
{% endfor %}
{% endif %}

Наиболее вероятная причина в том, что часть вашего представления try except ведет вас туда, потому что не находит объект Product. Комментарий Джона Гордона даст вам способ выяснить это, но он не запускается в браузере и не выдает ошибку 404. Вот как сделать то, что он предлагает. Запустите в терминале следующее:

python manage.py shell

Затем, когда откроется приглашение оболочки, выполните:

print(Product.objects.prefetch_related('productimage_set').filter(slug=product_slug))

Вот другой способ сделать это без оболочки:

def product_view(request: WSGIRequest, product_slug: str):

    # First see if product_slug is what you expect it to be:
    print('product_slug = ', product_slug)

    try:
        product = (
            Product.objects
                .prefetch_related('productimage_set')
                .filter(slug=product_slug)
                .first()
        )

        # Now check to see if django is finding any Product object with your filters:
        print(product)

        is_in_cart = CartProduct.objects.filter(
           product=product,
           cart__user=request.user,
           cart__active=True).first()
        context = {
          'product': product,
        # 'is_in_cart': is_in_cart,
       }
    except Product.DoesNotExist:
       # If the product is not found (None) then your code takes you here
       raise Http404
    return render(
       request, 'shop/product.html',
       context)

Если, как я подозреваю, дело именно в этом, то вы можете устранить неполадки в модели продукта и в том, как получается product_slug. Для этого мне нужно увидеть ваш шаблон models.py, а также шаблон product.html (в предоставленном вами шаблоне нет ссылок/кнопок, которые бы вели к представлению.

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