Как при выборе категории отобразить как элементы этой категории, так и элементы всех ее подкатегорий?

Я новичок в django, да и в python тоже, сейчас практикуюсь в создании интернет-магазина и столкнулся с проблемой, что было бы логично при выборе категории, также отображать товары из всех ее подкатегорий. Google, к сожалению, не помог... Думаю, что нужно как-то правильно фильтровать товар в представлениях, но как? Навыков не хватает, чтобы понять. Использование Django-mptt для дерева категорий (меньше запросов к базе данных)

models.py

class Category(MPTTModel):
name = models.CharField(max_length=200, db_index=True)
slug = models.SlugField(max_length=200, db_index=True, unique=True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

class MPTTMeta:
    order_insertion_by = ['name']

class Meta:
    ordering = ('name',)
    verbose_name = 'Категория'
    verbose_name_plural = 'Категории'

def get_absolute_url(self):
    return reverse('shop:product_list_by_category',
                    args=[self.slug])


def __str__(self):
    return self.name

views.py

def product_list(request, category_slug=None):
category = None
categories = Category.objects.all()
products = Product.objects.filter(available=True).order_by('-created')
if category_slug:
    category = get_object_or_404(Category, slug=category_slug)
    products = products.filter(category=category)
return render(request,
              'shop/shop.html',
              {'category': category,
              'categories': categories,
               'products': products})

html

<div class="category_conteiner">
{% recursetree categories %}
    <div class="sub_menu_category">
        <a href="{{ node.get_absolute_url }}" class="subcatbtn">{{ node.name }}</a>
        {% if not node.is_leaf_node %}
        <div class="subcat_content">
            <div class="subcat_column">
                {{ children }}
            </div>
        </div>
        {% endif %}
    </div> 
{% endrecursetree %}

Например, существуют такие категории:
--- Одежда
--- Куртки
--- Шапки

Если товар находится в категории "Куртки" и мы переходим в эту категорию, то все в порядке, но если мы перейдем в "Одежду", то там будет пусто, но вам нужно иметь все товары как из категории "Куртки", так и из категории "Шапки"

Теперь сортировка товаров происходит только по той категории, которая была выбрана при добавлении товара

Вы можете сделать это на дополнительном шаге. Вам нужно получить дочерние категории и затем отфильтровать товары по ним. Пример кода:

category = Category.objects.get(category_slug=category_slug)
sub_categories = category.get_descendants(include_self=True)
Product.objects.filter(category__in=sub_categories)

А вот полный код для вашего случая.

def product_list(request, category_slug=None):
    category = None
    categories = Category.objects.all()
    products = Product.objects.filter(available=True).order_by('-created')
    if category_slug:
        category = get_object_or_404(Category, slug=category_slug)
        sub_categories = category.get_descendants(include_self=True)
        products = products.filter(category__in=sub_categories)
    return render(request,
                  'shop/shop.html',
                  {'category': category,
                  'categories': categories,
                   'products': products})
Вернуться на верх