我有这个简化的模型:
class Item(models.Model):
name = models.CharField(max_length=120)
class ItemImage(models.Model):
image = models.ImageField(upload_to='upload_dir')
item = models.ForeignKey(Item)
Item
可以有多个ItemImages
。我还有一个模板从视图中呈现以下数据集:
items = Item.objects.all()
所以现在我想在模板中做这样的事情:
{% for item in items %}
<div>
{{ item.name }}<br>
<img src="{{ item.itemimage_set.all()[0] }}">
</div>
{% endfor %}
但显然这是不可能的。至少不是直接来自模板。
获取模板中第一个图像的等效方法是什么?
答案 0 :(得分:50)
{% with item.itemimage_set.all|first as image %}
<img src="{{ image.url }}" />
{% endwith %}
答案 1 :(得分:11)
或者您可以为Item
模型添加方法:
def get_first_image(self):
return self.itemimage_set.all()[0]
然后在模板中调用此方法:
{{ item.get_first_image }}
或者您可以使用:
{{ item.itemimage_set.all.0 }}
并获取第一张图片的网址:
<img src="{{ item.itemimage_set.all.0.url }}">
虽然如果你需要更大的灵活性(在某些情况下不止一张图片等),最好写一个小模板标签。
答案 2 :(得分:7)
一种可能的方法是迭代所有ItemImage
,如下所示:
{% for item in items %}
<div>
{{ item.name }}<br>
{% for image in item.itemimage_set.all %}
<img src="{{ image.image.url }}">
{% endfor %}
</div>
{% endfor %}
答案 3 :(得分:3)
如果你想要设置第一张照片,你可以这样做:
{% for item in item.image_set.all %}
{{if forloop.first }}
<img src="{{ item.url }}">
{% endif %}
{% endfor %}
但我也喜欢Andray与&#39;
的解决方案答案 4 :(得分:2)
这对我有用,请在模型中使用related_name。
<强> models.py 强>
class Building(models.Model):
address = models.CharField(max_length=200, blank=True, null=True)
city = models.CharField(max_length=200, blank=True, null=True)
class Space(models.Model):
title = models.CharField(max_length=200, blank=True, null=True)
building = models.ForeignKey(Building, related_name="spaces_of_this_building")
<强> buildings.html 强>
{% for space in building.spaces_of_this_building.all %}
{{ space.size }}
{% endfor %}