Как я могу устранить ошибку 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 (в предоставленном вами шаблоне нет ссылок/кнопок, которые бы вели к представлению.