如何在首页显示类别产品?

  • 本文关键字:显示 首页 django
  • 更新时间 :
  • 英文 :


我想在主页上按类别逐行显示所有产品。假设,在开始新行之前将有一个标题(类别名称),然后将根据产品类别显示所有产品,然后再次将根据类别开始一个标题的新行。我该怎么做?我应用了3/4方法,但没有工作。下面,我展示了其中一种方法。它不能正常工作。请帮帮我。

views.py:

def home(request):
all_products = Products.objects.all()
context ={
"all_products":all_products,
}
return render(request,'home.html', context)

model.py:

class Category(models.Model):
title = models.CharField(blank=True, null=True, max_length = 100)
def __str__(self):
return str(self.title)
class Products(models.Model):
product_image = models.ImageField(blank=True, null=True, upload_to = "1_products_img")
product_title = models.CharField(blank=True, null=True, max_length = 250)
product_price = models.IntegerField(blank=True, null=True)
offer_price = models.IntegerField(blank=True, null=True)
created_date = models.DateTimeField(blank=True, null=True, auto_now=True)

product_category = models.ForeignKey(Category, related_name="categoty_related_name", on_delete=models.CASCADE, blank=True, null=True)

context_processors.py:

from .models import Category
def categories(request):
return {"categories":Category.objects.all()}

模板:

{% for products in all_products %}
<h4 class="text-start montserrat_alternates_font ">{{products.product_category}}</h4>
<hr>
<!--- product card --->
<div class="col mb-5">
<div class="card h-100">
<!-- Sale badge-->
{% if products.offer_price != None %}
<div class="badge bg-dark text-white position-absolute" style="top: 0.5rem; right: 0.5rem">
SALE
</div>
{% endif %}
<!-- Product image-->
<img class="card-img-top" style="height:150px;" src="{{products.product_image.url}}" alt="..." />
<!-- Product details-->
<div class="card-body ">
<div class="text-center">
<!-- Product name-->
<h5 class="fw-bolder product_title" style="">{{products.product_title}}</h5>
</div>
</div>
</div>
</div>
{% endfor %}

你得稍微改变一下你的想法:)最简单的方法是从更大的"项目"来考虑问题。(像你的Category)到更小的(Product)。

首先,对模型使用单数命名,如Product(不带's',就像你对Category所做的那样),因为否则你最终会得到令人困惑的设置。此外,除非真的有必要,否则不要用模型的名称命名字段,product_category应该简单地称为category,等等。

其次,用Category打开for大循环,作为经典视图的上下文传递:

def home(request):
categories = Category.objects.all()
context = {
"categories": categories,
}
return render(request,'home.html', context)

然后查看Product:

中的ForeignKey字段
class Products(models.Model):
...
category = models.ForeignKey(Category, related_name="products", ...)

关键是正确使用related name。在您的模板中,尝试这样的逻辑(使用related_name平滑地反向关系):

{% for category in categories %}
{{ category.title }}
{% for product in category.products.all %}
{{ product.title }} - {{ product.price }}
{% endfor %}
{% endfor %}

如果你没有设置related_name,那么它可以用<model_name>_set.all()访问,在本例中是product_set.all()(当然,在没有括号的模板中)。无论如何,它会像一个魅力:)

最新更新