2017-12-25 9 views
0

私はこの単純化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

最も簡単なモデルでロジックを維持し、あなたがテンプレートにアクセスできるメソッドやプロパティ

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' 
+0

グレート、ありがとうございました!方法が最も簡単です。 – kotmsk

+0

@kotmsk私は財産や、より良い 'cached_property'(' django.utils.functional'から)に行きます。 https://docs.djangoproject.com/en/2.0/ref/utils/#module-django.utils.functional – cezar