Не находит страницу с продуктом (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'),
И все будет работать.