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)