Django _Categorize products

Я хочу показать определенные категории товаров на одной странице. Каждая категория имеет подзаголовок и определенные категории в группе. Когда я запускаю enve, все хорошо, но каждая подкатегория выводит все товары, даже те, которые находятся в других категориях. Как я могу это исправить.

def waterProducts(request):
    category = request.POST.get('category')
    if category == None:
        products = Product.objects.order_by('-price').filter(is_published=True)
    else:
        products = Product.objects.filter(categoryname=category)
    categories = Category.objects.all()
    context = {
        'products': products,
        'categories': categories
    }

    return render(request, "products/WaterProductPage.html", context)

Выше приведены мои файлы view.py, где я подтверждаю наличие категории.

    <main style="background-image: url(images/waterrocks.jfif)">
        <section class="body-section">

            <div class="all-products">
                <!--Water coolers-->
                {%for category in categories%}
                <section class="main-products cooler">
                    <div class="upper-bar">
                        <div>
                            <h2>{{category.name}}</h2>
                        </div>
                        <div class="sortby">
                            <span>Sort By: <select class="sort">
                                    <option value="highest">Highest Price</option>
                                    <option value="lowest">Lowest Price</option>
                                </select></span>
                        </div>
                    </div>

                    <hr />

                    <!--Single Products-wrap-->
                    <div class="specific-product-wrap specific-product-wrap-cooler">
                        {%if products%}
                        {%for product in products%}
                        <a href="{%url 'product' product.pk%}">
<div class="specific-single-product">
    <div class="product-image center">
        <img class="product-image-shape" src="{{product.image.url}}" alt="adamol Distilled" />
    </div>
    <div class="produc-descriptions">
        <h4 class="specific-product-title">{{product.title}}</h4>
        <p class="one-line-description"></p>
        <p class="price">Ksh.{{product.price}}</p>
        <button type="button" class="AddToCart">Add To Cart</button>
    </div>
</div>`
</a>
                        {%endfor%}
                        {%else%}
                        <p>No Product Lol</p>
                        {%endif%}

                    </div>
                </section>
                {%endfor%}

Выше представлен мой html шаблон, в котором я вывожу каждую категорию с соответствующим товаром.

    class Category(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name


class Product(models.Model):
    image = models.ImageField(null=False, blank=False)
    title = models.CharField(max_length=2000, null=False, blank=False)
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE, default=True, null=False)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    description = models.TextField()
    is_published = models.BooleanField(default=True)
    created_at = models.DateTimeField(default=datetime.now, blank=True)

    def __str__(self):
        return self.title

Приведенный выше код предназначен для model.py, где я объявляю категорию как ключ foregn.

В вашем файле views в части else должно быть

products = Product.objects.filter(category=category)

Вы получаете продукты, связанные с Category с помощью category.product_set, так:

{% for category in categories %}
    <!-- … -->
    <h2>{{category.name}}</h2>
    <!-- … -->
    {% for product in category.product_set.all %}
        <a href="{%url 'product' product.pk %}">
        <!-- … -->
        <h4 class="specific-product-title">{{ product.title }}</h4>
        <!-- … -->
    {% empty %}
        <p>No Product Lol</p>
    {% endfor %}
{% endfor %}

В category.product_set.all будут получены все связанные с Product для данного Category, и, таким образом, не будут отображены все

Если вы хотите использовать только Product с is_published=True и упорядоченные по price, вы можете использовать Prefetch объект:

from django.db.models import Prefetch

def waterProducts(request):
    categories = Category.objects.prefetch_related(Prefetch(
        'product_set',
        queryset=Product.objects.filter(is_published=True).order_by('-price')
    ))
    context = {
        'categories': categories
    }
    return render(request, "products/WaterProductPage.html", context)
Вернуться на верх