Django:检查模板是否queryset为空

时间:2019-05-04 14:54:27

标签: django templates view django-queryset

我已经找到解决方案,但是只能通过查看视图来解决。我需要检入模板。

我的观点:

brands = Brand.objects.all()
for brand in brands:
    brand.products = Product.objects.filter(brand=brand.id)

所以在我的模板中,我想显示我所有的品牌,而不是那些没有任何产品的品牌。

{% for brand in brands %}
    {% if brand.product is not None %}
        <!-- Displays brand -->
    {% endif %}
{% endfor %}

类似的事情,但是代码is not None不适用于空查询集,并且仍然显示其中没有对象的品牌。我该怎么办?

编辑:根据要求共享模型。

class Brand(models.Model):
    name = models.CharField(max_length=100, null=False)

    def __str__(self):
        return self.name


class Product(models.Model):
    name = models.CharField(max_length=100, null=False)
    brand = models.IntegerField(null=True)
    price = models.DecimalField(max_digits=12, decimal_places=2, null=False)

    def __str__(self):
        return self.name

3 个答案:

答案 0 :(得分:2)

您的模板应类似于:

fit

答案 1 :(得分:1)

使用IntegerField等来表示关系通常不是一个好主意。 Django使用ForeignKey [Django-doc]来实现这种关系。这样做有多个优点:(1)它将向数据库添加额外的约束,使得键只能引用真实的Brand; (2)您将有其他方法来检索相关的Product

因此Product模型应与ForeignKey模型具有Brand,例如:

class Product(models.Model):
    name = models.CharField(max_length=100, null=False)
    brand = models.ForeignKey(Brand, null=True, db_column='brand')
    price = models.DecimalField(max_digits=12, decimal_places=2, null=False)

这里我们保持数据库结构本身不变,但是它将在其上添加一个ForeignKey以及一个 index ,从而检索给定Brand的所有产品快得多。

在模板中编写(业务)逻辑通常是一个坏主意。实际上,Django模板语言不允许使用参数等进行调用的原因之一是避免人们在模板中编写业务逻辑。因此,我强烈建议您将逻辑转移到视图上。

您可以使用单线检索在视图中至少具有一个相关Brand的{​​{1}}:

Product

因此,不必单独检查每个品牌。在这里,我们还检查了所有Brand.objects.filter(product__isnull=False).distinct()单个查询中是否存在Product,而不是每个Brand都要检查一个额外的{ {1}}个。

这将导致查询如下:

Brand

答案 2 :(得分:0)

如果要在集合为空时显示不同的内容,请检查以下内容:

{% for i in list %}
    // Do this in non - empty condition
{% empty %}
    // Do this in empty condition
{% endfor %}

信用:GeeksForGeeks