Django
1class Product(models.Model): 2 name = models.CharField(max_length=200, null=True) 3 price = models.FloatField() 4 digital = models.BooleanField(default=False, null=True, blank=False) 5 image = models.ImageField(null=True, blank=True) 6 7 def __str__(self): 8 return self.name 9 10 @property 11 def image_url(self): 12 try: 13 url = self.image.url 14 except: 15 url = '' 16 return url
HTML
1 2{% for product in products %} 3 <div class="col-lg-4"> 4 <img class="thumbnail" src="{{ product.image_url }}"> 5 </div> 6{% endfor %} 7
<img>
内でproduct.image.url
と記述すると、画像がuploadされていなかった場合にValueError
になるのでProduct(Model)
内でメソッドを使って、url
を場合分けをするところまでは理解できます。
しかし、なぜdef image_url(self):
に@property
をつけているのでしょうか。
関数名をdef image(self)
にして@property
をつけると、setterを作る必要がでてくるため(管理画面で画像をuploadするfieldがなくなります)、関数名をdef image_url(self):
としているのだと理解しています。であれば、もはやgetterとしての役割がない気がしているのですが、@property
をつける理由は何でしょうか。
ちなみに、@property
のありなしで動作に違いがありませんでした。
(stackoverflowで調べるとほとんどのものが@property
を使用しています)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。