Страница не найдена (404). Ни одна категория не соответствует заданному запросу
Я создаю сайт электронной коммерции на фреймворке Django. При создании раздела категории, который ведет пользователя в отдельную категорию для доступа ко всем ее элементам, возникает следующая ошибка.
Page not found (404)
No Category matches the given query.
Request Method: GET
Request URL: http://127.0.0.1:8000/search/ring/
Raised by: store.views.category_list
Using the URLconf defined in core.urls, Django tried these URL patterns, in this order:
admin/
[name='all_product']
item/<slug:slug>/ [name='product_detail']
search/<slug:category_slug>/ [name='category_list']
The current path, search/ring/, matched the last one.
You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
Здесь находится файл urls.py
from django.urls import path
from . import views
app_name = 'store'
urlpatterns = [
path('', views.all_product, name='all_product'),
path('item/<slug:slug>/', views.product_detail, name='product_detail'),
path('search/<slug:category_slug>/', views.category_list, name='category_list'),
]
файлviews.py
from django.shortcuts import get_object_or_404, render
from .models import Product, Category
# Create your views here.
def categories(request):
return {
'categories': Category.objects.all()
}
def all_product(request):
product = Product.objects.all()
return render(request, 'store/home.html', {'product': product})
def category_list(request, category_slug):
category = get_object_or_404(Category, slug=category_slug)
product = Product.objects.filter(category=category)
return render(request, 'store/products/category.html', {'category': category, 'product': product})
def product_detail(request, slug):
product = get_object_or_404(Product, slug=slug, in_stock=True)
return render(request, 'store/products/detail.html', {'product': product})
файл models.py
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
# Create your models here.
class Category(models.Model):
name = models.CharField(max_length=100, db_index=True)
slug = models.SlugField(max_length=100, unique=True)
class meta:
verbose_name_plural = 'categories'
def get_absolute_url(self):
return reverse('store:category_list', args=[self.slug])
def __str__(self):
return self.name
class Product(models.Model):
category = models.ForeignKey(Category, related_name='product' , on_delete= models.CASCADE)
created_by= models.ForeignKey(User, on_delete=models.CASCADE, related_name='product_creator' )
title = models.CharField(max_length=100)
author = models.CharField(max_length=100, default='admin')
description = models.TextField(blank=True)
image = models.ImageField(upload_to='images/')
slug = models.SlugField(max_length=100)
price = models.DecimalField(max_digits=4, decimal_places=2)
in_stock = models.BooleanField(default=True)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(auto_now_add=True)
update = models.DateTimeField(auto_now=True)
class meta:
verbose_name_plural = 'products'
ordering = ('-created',)
def get_absolute_url(self):
return reverse('store:product_detail', args=[self.slug])
def __str__(self):
return self.title
И файл category.html
{% extends "../base.html" %}
{% load static %}
{% block title %}
{% if category %}{{ category.name }}{% else %}Product{% endif %}
{% endblock %}
{% block content %}
<main>
<div class="album py-5 bg-light">
<div class="container">
<div class="pb-3 h5">{{category.name|title}}</div>
<div class="row row-cols-1 row-cols-sm-2 row-cols-md-5 g-3">
{% for product in product %}
<div class="col">
<div class="card shadow-sm">
<img class="img-fluid" alt="Responsive image" src="{{ product.image.url }}">
<div class="card-body">
<p class="card-text">
<a class="text-dark text-decoration-none" href="{{ product.get_absolute_url }}">{{ product.title }}</a>
</p>
<div class="d-flex justify-content-between align-items-center">
<small class="text-muted">5 min read</small>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</main>
{% endblock %}
Каждый раз, когда я ввожу '127.0.0.1:8000/search/ring' в строке url, он выдает ошибку для поиска категории, упомянутой выше, но он работает нормально для деталей продукта, т.е. '127.0.0.1:8000/item/ring'.
вам, вероятно, следует изменить <slug:slug>
и <slug:category_slug>
на
<str:slug>
и <str:category_slug>
в вашем urls.py