Не находит страницу с продуктом (Page not found (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('shop/', views.CatalogList.as_view(), name='shop'),
   path('category/<slug:category_slug>/', views.category_list, name='category'),
   path('category/<slug:product_slug>/', views.product_view, name='product'),

основной urls

path('admin/', admin.site.urls),
path(' ', include('page.shop.urls')),
path('', views.HomeTemplateView.as_view(), name='Home'),
path('', include('page.news.urls', namespace='news')),

шаблон

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

У вас в основном urls.py префикс содержит пробел, а это уже совсем другой url. Исправьте на пустую строку:

path('', include('page.shop.urls')),

Но правильнее будет указать здесь префикс shop/

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

и изменить локальный urls.py:

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

У вас проблема в том, что Django находит совпадающий шаблон урла и пытается его обработать. Это страница категории. Объект не находится и выдет исключение 404.

Замените шаблон на товар, например

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

И все будет работать.

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