通过ForeignKey访问QuerySet中的parrent模型的图像字段[Django]

时间:2017-12-25 13:37:58

标签: python django

我有这个简化的model.py

class Product(models.Model):
    name = models.CharField()
    description = models.CharField()

class ProductImage(models.Model):
    product = models.ForeignKey(Product,)
    photo = models.ImageField(upload_to="product_images/")
    is_main = models.BooleanField(default=False)

Product可以有多个ProductImage,但只有ProductImage的字段is_main=True应与Product的所有字段一起呈现在模板中。

views.py

中的以下数据集
products = Product.objects.all()

所以现在我想在模板中做这样的事情:

{% for product in products %}
<img class="card-img-top" src="{{ product.productimage_set.filter(is_main=True).photo }}" alt="Card image cap">
<div class="card-body">
    <h4 class="card-title">{{ product.name }}</h4>
    <p class="card-text">{{ product.description }}</p>
    <a href="#" class="btn btn-primary">Go somewhere</a>
</div>

但显然这是不可能的。至少不是直接来自模板。

在模板中获取Product及其带有属性is_main=True的图像的所有字段的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

最简单的方法是将逻辑保留在模型中并添加方法或属性

class Product(models.Model):
    # ...
    def main_image(self):
        return self.productimage_set.get(is_main=True)
        # or more robust:
        # return self.productimage_set.filter(is_main=True).first()

您可以在模板中访问:

 ... src="{{ product.main_image.photo.url }}  # don't forget the 'url'