Приветствую, у меня небольшая проблема. Необходимо чтобы отображалось на странице категории продукты если имеются что я уже сделал и подкатегория в которой если есть продукты то выводятся в списке они, если подкатегории то выводятся подкатегории.
Но при попытке сделать
продукты подкатегории
не выводятся в списке подкатегории, а
выводятся продукты родителя
Иллюстрации
views.py
def show_category(request, hierarchy=None):
hierarchy = (hierarchy or "").strip("/") # Remove stray slashes
if hierarchy:
category_slug = hierarchy.split('/')
parent = None
for slug in category_slug[:-1]:
parent = Categories.objects.get(parent=parent, slug=slug)
try:
category = Categories.objects.get(parent=parent, slug=category_slug[-1])
except:
products = get_object_or_404(Goods, slug=category_slug[-1])
return render(request, "shop/product.html", {'good': products})
else:
category = None
if category:
if Goods:
# Вот тут берутся продукты категории
products = None
products = category.products.all()
return render(request, 'shop/categories.html', {'instance': category, 'products': products})
# No category, show top-level content somehow
category = Categories.objects.filter(parent=None)
return render(request, 'shop/category.html', {'categories': category})
models.py
class Categories(MPTTModel):
title = models.CharField(max_length=250, db_index=True)
slug = models.SlugField(max_length=250, unique=True)
imagePath = models.ImageField(upload_to='images/categories/', blank=True, verbose_name='Изображение категории')
parent = TreeForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)
class MPTTMeta:
order_insertion_by = ['title']
class Meta:
unique_together = (('parent', 'slug',))
verbose_name_plural = 'categories'
verbose_name = 'Категория'
verbose_name_plural = 'Категории'
class Goods(models.Model):
title = models.CharField(max_length=150, db_index=True)
slug = models.SlugField(max_length=150, db_index=True, unique=True)
description = RichTextField(verbose_name='Описание')
imagePath = models.ImageField(upload_to='images/goods', blank=True, verbose_name='Изображение категории')
categoryID = TreeForeignKey('categories', related_name='products', null=True, blank=True, db_column='categoryID', on_delete=models.CASCADE)
available = models.BooleanField(default=True)
class Meta:
ordering = ['title']
index_together = ['id', 'slug']
verbose_name = 'Товар'
verbose_name_plural = 'Товары'
{% if instance %}
{% for i in instance.get_children %}
<div class="col-md-4">
<div class="card">
<img src="/media/{{ i.imagePath }}" class="card-img-top" id="first">
<div class="card-body">
<h5 class="card-title fw-bold">{{ i.title }}</h5><br>
<ul class="list-group list-group-flush">
{% if products %}
{% for product in products %}
<li class="list-group-item link"><a id="{{ product.id }}" href="{{ instance.get_absolute_url }}/{{ product.slug }}" data-image="/media/{{ product.imagePath }}">{{ product.title }}</a></li>
{% endfor %}
{% elif i %}
{% for cat in i.get_children %}
<li class="list-group-item link"><a id="{{ cat.id }}" href="{{ instance.get_absolute_url }}/{{ cat.slug }}/{{ cat.slug }}" data-image="/media/{{ cat.imagePath }}">{{ cat.title }}</a></li>
{% endfor %}
{% endif %}
</ul>
</div>
</div>
</div>
{% endfor %}
{% endif %}
# Это левый блок продукта категории в Иллюстрации
{% if products %}
{% for product in products %}
<div class="col-md-4">
<div class="card mb-4">
<img class="card-img-top" src="/media/{{ product.imagePath }}" alt="Card image cap">
<div class="card-body">
<h5 class="card-title fw-bold">{{ product.title }}</h5>
<p class="card-text">{{ product.description|safe|slice:":84" }}</p>
<a href="{{ instance.get_absolute_url }}/{{ product.slug }}" class="nav-link" style="margin-top: 8px">Подробнее...</a>
</div>
</div>
</div>
{% endfor %}
{% endif %}
Подскажите пожалуйста, как решить эту проблему.