Как избавиться от дублей категорий в Django?
Помогите разобраться, пожалуйста. Не получается отфильтровать категории и подкатегории. Категории дублируются столько раз сколько подкатегорий в них есть.
HTML
<header class="header">
<div class="filter-category">
<button class="button button_type_all" data-filter="all">Все</button>
{% for c in categories %} {# Все категории #}
{% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
{% for sc in subcategories %} {# Все подкатегории #}
{% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
{% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
<button class="button button_type_dog"
data-filter="{{ c.slug }},{{ sc.slug }}">{{ c.cat_name }}</button> {# Кнопки для категорий по которым производится фильтрация. Если в категории несколько подкатегорий, то и кнопок с одинаковым названием будет несколько. Нужно только по одной кнопке для каждой категории #}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</div>
<div class="filter">
{% for c in categories %} {# Все категории #}
{% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
{% for sc in subcategories %} {# Все подкатегории #}
{% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
{% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
<button class="button button_type_cat"
data-filter="{{ sc.slug }}">{{ sc.sub_cat_name }}</button> {# Все кнопки подкатегорий по которым производится фильтрация#}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</div>
</header>
<main class="content">
<div class="container">
{% for c in categories %} {# Все категории #}
{% if c.get_prods__count > 0 %} {# Все категории в которых есть товары #}
{% for sc in subcategories %} {# Все подкатегории #}
{% if sc.get_prods__count > 0 %} {# Все подкатегории в которых есть товары #}
{% if c.pk == sc.category_id %} {# Все категории рк которых совпадает с id категории в подкатегории#}
{% for p in prods %} {# Все товары #}
{% if p.subcategory_id == sc.pk %} {# Все товары id подкатегорий которых совпадают с рк подкатегорий #}
{% if p.photo %}
<div class="card {{ sc.slug }}">
<a href="{{ p.get_absolute_url }}"> {# карточки товаров #}
{{ p.title }}
</a>
</div>
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endif %}
{% endfor %}
{% endif %}
{% endfor %}
</div>
</main>
Models
from django.urls import reverse
from django_unique_slugify import unique_slugify
from pytils.translit import slugify
from smart_selects.db_fields import ChainedForeignKey
class Category(models.Model):
cat_name = models.CharField(max_length=25, verbose_name='Название')
slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=True)
@staticmethod
def get_all_categories():
return Category.objects.all()
def __str__(self):
return self.cat_name
def get_absolute_url(self):
return reverse('category', kwargs={'cat_slug': self.slug})
def save(self, *args, **kwargs):
slug_str = slugify(self.cat_name)
unique_slugify(self, slug_str)
if not self.slug:
self.slug = slugify(self.cat_name)
super(Category, self).save(*args, **kwargs)
class Meta:
verbose_name_plural = 'Категории'
verbose_name = 'Категория'
ordering = ['cat_name']
class SubCategory(models.Model):
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, blank=True, verbose_name='Категория',
related_name='get_subcats')
sub_cat_name = models.CharField(max_length=25, unique=True, verbose_name='Название')
slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
time_create = models.DateTimeField(auto_now_add=True)
time_update = models.DateTimeField(auto_now=True)
is_published = models.BooleanField(default=True)
@staticmethod
def get_all_subcategories():
return SubCategory.objects.all()
def __str__(self):
return self.sub_cat_name
def get_absolute_url(self):
return reverse('subcategory', kwargs={'cat_slug': self.category.slug, 'scat_slug': self.slug})
def save(self, *args, **kwargs):
slug_str = slugify(self.sub_cat_name)
unique_slugify(self, slug_str)
if not self.slug:
self.slug = slugify(self.sub_cat_name)
super(SubCategory, self).save(*args, **kwargs)
class Meta:
verbose_name_plural = 'ПодКатегории'
verbose_name = 'ПодКатегория'
ordering = ['sub_cat_name']
class Product(models.Model):
price = models.DecimalField(max_digits=15, decimal_places=2, null=True, verbose_name='Цена')
category = models.ForeignKey('Category', on_delete=models.SET_NULL, null=True, verbose_name='Категория',
related_name='get_prods')
subcategory = ChainedForeignKey(
'SubCategory',
on_delete=models.SET_NULL,
null=True,
verbose_name='ПодКатегория',
related_name='get_prods',
chained_field='category',
chained_model_field='category',
show_all=False,
auto_choose=True,
sort=True
)
title = models.CharField(max_length=255, verbose_name='Название')
slug = models.SlugField(max_length=255, unique=True, db_index=True, verbose_name='URL')
content = models.TextField(blank=True, verbose_name='Текст')
photo = models.ImageField(upload_to='images/%Y/%m/%d/', verbose_name='Фото')
time_create = models.DateTimeField(auto_now_add=True, verbose_name='Создано')
time_update = models.DateTimeField(auto_now=True, verbose_name='Обновлено')
is_published = models.BooleanField(default=True, verbose_name='Опубликовано')
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('product', kwargs={'cat_slug': self.category.slug, 'scat_slug': self.subcategory.slug,
'prod_slug': self.slug})
def save(self, *args, **kwargs):
slug_str = slugify(self.title)
unique_slugify(self, slug_str)
if not self.slug:
self.slug = slugify(self.title)
super(Product, self).save(*args, **kwargs)
class Meta:
verbose_name = 'Товары'
verbose_name_plural = 'Товары'
ordering = ['-id']
Помогите, пожалуйста, составить правильную фильтрацию.