在 Django 中按类别和品牌对产品进行分组和显示

时间:2021-07-21 14:43:31

标签: python django tree

我是 Django 的新手,目前在创建按类别和品牌分组的非常简单的产品列表时遇到问题。

这是预期的结果:


 - Category 1
    + Brand A
        * Product 1
        * Product 2
    + Brand B
        * Product 3
        * Product 4

- Category 2
    + Brand A
        * Product 5
        * Product 6
    + Brand C
        * Product 7
        * Product 8

这是我的models.py

from django.db import models


class Brand(models.Model):
    brand = models.CharField(max_length=200)
    country = models.CharField(max_length=200, blank=True, null=True)
    email = models.EmailField(max_length=200, blank=True, null=True)
    url = models.URLField(max_length=300)

    def __str__(self):
        return self.brand


class Category(models.Model):
    category_id = models.CharField(max_length=200, default="cat")
    name = models.CharField(max_length=200)

    def __str__(self):
        return self.category_id


class Product(models.Model):
    category = models.ForeignKey(Category, on_delete=models.CASCADE)
    name = models.CharField(max_length=200) 
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    desc = models.CharField(max_length=200, blank=True, null=True)
    img = models.CharField(max_length=200)
    url = models.URLField(max_length=300, blank=True, null=True)

    def __str__(self):
        return f"{self.brand} - {self.name} - {self.category}"

我的views.py

def product_list(request):
    products = Product.objects.all()
    categories = Category.objects.all()
    brands = Brand.objects.all()
    context = {
        'products': products,
        'categories': categories,
        'brands': brands
    }
    return render(request, "product/product-list.html", context)

这是我在 product-list.html

中最接近预期的结果
<ul>
    {% for category in categories %}
    <li>{{ category }}</li>
    <ul>
        {% for brand in brands %}
        <li> {{ brand }}</li>
        <ul>
            {% for product in products %}

            {% if product.category == category and product.brand == brand %}

            <li> {{ product }}</li>

            {% endif %}

            {% endfor %}
        </ul>
        {% endfor %}
    </ul>
    {% endfor %}
</ul>

其中一个问题是,即使一个品牌没有与该类别相关联的产品,它仍然会显示出来并引导我认为这肯定不是最好的方法。

如果您能指出我正确的方向,我将不胜感激!

谢谢

斯蒂法诺

1 个答案:

答案 0 :(得分:0)

您有一个从 ProductBrand 的多对一关系,您需要为 BrandCategory 添加另一个。之后您可以使用相关对象引用。请查看此文档:https://docs.djangoproject.com/en/3.2/ref/models/relations/