首页如何显示类别产品?

问题描述 投票:0回答:2

我想在主页上按类别逐行显示我的所有产品。假设在开始新行之前将有一个标题(类别名称),然后将根据产品类别显示所有产品,然后再次根据类别开始一个带有标题的新行。 我该怎么做?我应用了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 %}
django
2个回答
1
投票

你必须稍微改变一下你的想法:) 最简单的方法是从较大的“项目”(例如您的

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()
(当然,在没有括号的模板中)。不管怎样,它会像魅力一样发挥作用:)


0
投票

#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'),
]
© www.soinside.com 2019 - 2024. All rights reserved.