Реверс для 'products-by-sub-category' с аргументами '('fantasy-fiction',)' не найден
Когда я использую функцию get_url в модели SubCategroy, она выдает ошибку, подобную этой.
NoReverseMatch at /products/category/fiction/ Обратный запрос для 'products-by-sub-category' с аргументами '('fantasy-fiction',)' не найден. 1 шаблон(ы) проверены: ['products/\^category/\(\?P(?P<category_slug>[-a-zA-Z0-9_]+)\[\-\\W\]\+\)/\(\?P(?P<sub_category_slug>[-a-zA-Z0-9_]+)\[\-\\w\]\+\)/\$\Z']
ошибок нет, когда я не использую {{sub_category.get_url }} в моем HTML. но я хочу использовать URL каждой подкатегории в HTML. что я делаю неправильно?
то, как я использовал подкатегории, возможно, не очень хорошая идея. если есть хорошие предложения, пожалуйста, добавьте к ответу.
Кроме того, я хочу использовать язык в качестве еще одного критерия категоризации. есть ли лучший или альтернативный способ реализовать это?
Мой html
{% if category_links %}
{% for category in category_links %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle active" href="" data-bs-toggle="dropdown">{{ category.category_name }}</a>
<ul class="dropdown-menu list-unstyled category-list ">
{% if sub_category_links %}
{% for sub_category in sub_category_links %}
{% if sub_category.category_id == category.pk %}
<li><a class="dropdown-item" href="{{ sub_category.get_url }}"> {{ sub_category.subcategory_name }} </a></li>
{% endif %}
{% endfor %}
{% endif %}
<li><a class="dropdown-item" href="{{ category.get_url }}"> View All </a></li>
</ul>
</li>
{% endfor %}
{% endif %}
urls.py
urlpatterns = [
path('', views.products, name="products"),
path('category/<slug:category_slug>/', views.products, name='products-by-category'),
path('category/<slug:category_slug>/<slug:sub_category_slug>/', views.products, name='products-by-sub-category'),
path('language/<slug:language_slug>/', views.products_by_language, name='products-by-language'),
]
views.py
def products(request, category_slug=None, sub_category_slug= None):
categories = None
sub_categories = None
products = None
if category_slug is not None:
if sub_category_slug is not None:
sub_categories = get_object_or_404(SubCategory, slug=sub_category_slug)
products = Products.objects.filter(sub_category=sub_categories, is_available=True)
else:
categories = get_object_or_404(Category, slug=category_slug)
sub_categories = SubCategory.objects.filter(category=categories)
products = Products.objects.filter(sub_category__in=sub_categories, is_available=True)
else:
products = Products.objects.all().filter(is_available=True)
context = {
'products' : products
}
return render(request, 'products/products.html', context)
def products_by_language(request, language_slug=None):
language = None
products = None
if language_slug is not None:
language = get_object_or_404(Language, slug=language_slug)
products = Products.objects.filter(language=language, is_available=True)
else:
products = Products.objects.all().filter(is_available=True)
context = {
'products' : products
}
return render(request, 'products/products.html', context)
models.py
class Category(models.Model):
category_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=100, unique=True)
description = models.TextField(max_length=255, blank=True)
image = models.ImageField(upload_to='images/categories', blank=True)
class Meta:
verbose_name = 'category'
verbose_name_plural = 'categories'
def get_url(self):
return reverse('products-by-category', args=[self.slug])
def __str__(self):
return self.category_name
class SubCategory(models.Model):
subcategory_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=100, unique=True)
category = models.ForeignKey('Category', on_delete=models.CASCADE)
description = models.TextField(max_length=255, blank=True)
image = models.ImageField(upload_to='images/subcategories', blank=True)
class Meta:
verbose_name = 'sub category'
verbose_name_plural = 'sub categories'
def get_url(self):
return reverse('products-by-sub-category', args=[self.slug])
def __str__(self):
return self.subcategory_name
class Language(models.Model):
language_name = models.CharField(max_length=50, unique=True)
slug = models.SlugField(max_length=100, unique=True)
description = models.TextField(max_length=255, blank=True)
image = models.ImageField(upload_to='images/subcategories', blank=True)
class Meta:
verbose_name = 'language'
verbose_name_plural = 'languages'
def get_url(self):
return reverse('products-by-language', args=[self.slug])
def __str__(self):
return self.language_name
context_processors.py
from .models import Category, SubCategory, Language
def category_links(request):
links = Category.objects.all()
return dict(category_links=links)
def sub_category_links(request):
links = SubCategory.objects.all()
return dict(sub_category_links= links)
def language_links(request):
links = Language.objects.all()
return dict(language_links= links)
полная ошибка
Урл products-by-sub-category
ожидает два аргумента slug, category_slug
и sub_category_slug
, но вы передаете только один аргумент в reverse()
.
Вы можете попробовать следующее:
class SubCategory(models.Model):
. . .
def get_url(self):
return reverse(
'products-by-sub-category',
args=[self.category.slug, self.slug]
)