Реверс для '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]
    )

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