@WITT

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

Я новичок в джанго, да и в питоне тоже, сейчас практикуюсь на создании интернет магазина и послал перед проблемой что логично было бы при выборе категории также выводить и товары из всех её подкатегорий. Гугл, к сожалению не помог... я думаю что нужно как нибудь правильно отфильтровать товар в представлениях, но как? навыков не хватает понять. Использую 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 %}


Сейчас сортировка товаров получается только по той категории которая была выбрана при добавлении товара
  • Вопрос задан
  • 2020 просмотров
Решения вопроса 1
@WITT Автор вопроса
Ответ из StackOverflow если у кого то будет похожая ситуация

Вы можете сделать это на дополнительном шаге. Вам нужно получить дочерние категории, а затем отфильтровать по ним товары. Пример кода:
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})
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@WebDev921
<ul class="root">
    {% recursetree nodes %}
        <li>
            {{ node.name }}
            {% if not node.is_leaf_node %}
                <ul class="children">
                    {{ children }}
                </ul>
            {% endif %}
        </li>
    {% endrecursetree %}
</ul>


Дока
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы