我有这个简化的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
的图像的所有字段的正确方法是什么?
答案 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'