I started learning django and decided to create a clothing store. I would like to know how to make a filter to display products like men's - t-shirt || Female - T-shirt? At the moment, I have learned to display only by category T-shirts, hoodies and so on. How to make double filtering so that there is sorting by female and male?
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})
CodePudding user response:
You can use Q objects [Django-doc]
Keyword argument queries – in filter(), etc. – are “AND”ed together. If you need to execute more complex queries (for example, queries with OR statements), you can use Q objects.
from django.db.models import Q
Stuff.objects.filter(Q(gender__name__iexact='men') | Q(gender__name__iexact='female'))
CodePudding user response:
you can pass parameters in the url as you do with 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
