我想在主页上按类别逐行显示我的所有产品。假设在开始新行之前将有一个标题(类别名称),然后将根据产品类别显示所有产品,然后再次根据类别开始一个带有标题的新行。 我该怎么做?我应用了3/4方法,但没有成功。下面,我展示了其中一种方法。它无法正常工作。请帮助我。
views.py:
def home(request):
all_products = Products.objects.all()
context ={
"all_products":all_products,
}
return render(request,'home.html', context)
模型.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
等等。
其次,使用作为经典视图上下文传递的
for
打开大 Category
循环:
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()
(当然,在没有括号的模板中)。不管怎样,它会像魅力一样发挥作用:)
#inviews.py
def Category_product_item(请求,id=无,id2=无): ”“” 在oon页面显示类别和产品 ”“” 类别 = Category.objects.all() 如果身份证号: #检查 id 是否执行下面的下一个语句 类别 = Category.objects.get(id=id) 产品 = Product.objects.filter(类别=类别) context={'产品':产品,'类别':类别} 返回渲染(请求,'product/main.html',上下文) 上下文={'类别':类别} 返回渲染(请求,'product/main.html',上下文)
urls.py 从.views导入category_product_item
urlpatterns = [
path('', category_product_item, name='category_item'),
path('<int:id>/', category_product_item, name='product_view'),
]