Двойной фильтр django

Я начал изучать django и решил создать магазин одежды. Я хотел бы узнать, как сделать фильтр для отображения товаров типа мужское - футболка || женское - футболка? На данный момент я научился выводить только по категориям футболки, толстовки и так далее. Как сделать двойную фильтрацию, чтобы была сортировка по женским и мужским?

views.py

class StuffCategory(ListView):
    model = Stuff
    template_name = 'shop/shop.html'
    context_object_name = 'stuffs'

    def get_queryset(self):
        return Stuff.objects.filter(category__slug=self.kwargs['category_slug'], draft=False)

class StuffView(ListView):
    model = Stuff
    template_name = 'shop/shop.html'
    context_object_name = 'stuffs'
    paginate_by = 3

models.py

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=200, unique=True)

    class Meta:
        verbose_name = 'Категория'
        verbose_name_plural = 'Категории'

    def __str__(self):
        return self.name

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



class Gender(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(max_length=200, unique=True)

    class Meta:
        verbose_name = 'Гендер'
        verbose_name_plural = 'Гендеры'

    def __str__(self):
        return self.name
    def get_absolute_url(self):
        return reverse('gender', kwargs={'gender_slug': self.slug})


class Stuff(models.Model):
    name = models.CharField(max_length=100)
    price = models.FloatField()
    description = models.TextField()
    composition = models.CharField(max_length=150)
    instruction = models.CharField(max_length=150)
    manufacturer_country = models.CharField(max_length=150)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    gender = models.ForeignKey(Gender, on_delete=models.PROTECT)
    size = models.ManyToManyField(Size)
    photo = models.ImageField(upload_to='items/')
    slug = models.SlugField(max_length=200, unique=True)
    draft = models.BooleanField("Черновик", default=False)

    class Meta:
        verbose_name = 'Вещь'
        verbose_name_plural = 'Вещи'

    def __str__(self):
        return self.name

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

Вы можете использовать Q объекты [Django-doc]

Запросы с аргументами ключевых слов - в filter() и т.д. - объединяются по принципу "AND". Если вам нужно выполнять более сложные запросы (например, запросы с операторами OR), вы можете использовать Q-объекты.

from django.db.models import Q

Stuff.objects.filter(Q(gender__name__iexact='men') | Q(gender__name__iexact='female'))

вы можете передавать параметры в url, как вы это делаете с category_slug

class StuffCategory(ListView):
    # ...
    def get_queryset(self):
        queryset = Stuff.objects.filter(draft=False)
        if self.kwargs.get('category_slug'):
            queryset = queryset.filter(category__slug=self.kwargs['category_slug'])
        if self.kwargs.get('gender_slug'):
            queryset = queryset.filter(gender__slug=self.kwargs['gender_slug'])
        # ... and others if you want!
        return queryset
Вернуться на верх