Как фильтровать товары по категориям в Django?

Имеется страница с товарами. Мне нужно отобразить только те товары, которые принадлежат к одной категории.Я пытался использовать get_queryset(), но получил ошибку Unsupported lookup 'slug' for SlugField or join on the field not permitted.. Как я могу решить эту проблему?

<

model.py

class Category(models.Model):
    name = models.CharField(max_length=50, verbose_name="Ім'я категорії")
    slug = models.SlugField(unique=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse("category_detail",kwargs={'slug': self.slug})


class Product(models.Model):
    category = models.ForeignKey(Category, verbose_name='Категорія', on_delete=models.CASCADE)
    title = models.CharField(max_length=150, verbose_name='Ім\'я продукта')
    slug = models.SlugField(unique=True)
    product_code = models.IntegerField(default='0003001', verbose_name='Код продукту', blank=True, null=False)
    img = models.ImageField(verbose_name='Фотокартка')
    qty_product = models.IntegerField(default=1, verbose_name='Кількість товару')
    price = models.DecimalField(max_digits=5, decimal_places=0, verbose_name='Ціна')
    description = models.CharField(max_length=3000, verbose_name='Опис')

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('product_detail', kwargs={'slug': self.slug})

views.py

class CategoryDetailView(DetailView):
    model = Category
    queryset = Category.objects.all()
    template_name = "mainapp/product-category.html"
    slug_url_kwarg = 'slug'
    context_object_name = 'products'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        category = self.get_object()
        context['categories'] = self.model.objects.all()
        context['products'] = Product.objects.all()
        context['category_products'] = category.product_set.all()
        return context

    def get_queryset(self):
        return Product.objects.filter(slug__slug=self.kwargs['slug'])

Здесь не нужно делать фильтрацию, и уж точно не на Product модели: это DetailView [Django-doc] для Category модели, s o вы можете работать с:

class CategoryDetailView(DetailView):
    model = Category
    template_name = 'mainapp/product-category.html'
    context_object_name = 'category'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = self.model.objects.all()
        context['products'] = Product.objects.all()
        context['category_products'] = self.object.product_set.all()
        return context

Это передаст шаблону Category для заданного slug как category, а связанные Product как category_products.

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