Двойной фильтр 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