Ответ 1
{% with item.itemimage_set.all|first as image %}
<img src="{{ image.url }}" />
{% endwith %}
У меня есть эта упрощенная модель:
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)
An Item
может иметь много ItemImages
. У меня также есть шаблон, отображающий следующие данные из представления:
items = Item.objects.all()
Итак, теперь я хотел бы сделать что-то подобное в шаблоне:
{% for item in items %}
<div>
{{ item.name }}<br>
<img src="{{ item.itemimage_set.all()[0] }}">
</div>
{% endfor %}
Но, очевидно, это невозможно. Не из шаблона напрямую, по крайней мере.
Каков правильный способ получить эквивалент первого изображения внутри шаблона?
{% with item.itemimage_set.all|first as image %}
<img src="{{ image.url }}" />
{% endwith %}
Или вы можете добавить метод к своей модели Item
:
def get_first_image(self):
return self.itemimage_set.all()[0]
а затем вызовите этот метод в шаблоне:
{{ item.get_first_image }}
Или вы могли бы использовать:
{{ item.itemimage_set.all.0 }}
и получить первый URL-адрес изображения:
<img src="{{ item.itemimage_set.all.0.url }}">
Хотя, если вам нужна большая гибкость (более одного изображения в некоторых случаях и т.д.), лучше всего написать немного templatetag.
Одним из возможных способов было бы перебрать все ItemImage
так:
{% for item in items %}
<div>
{{ item.name }}<br>
{% for image in item.itemimage_set.all %}
<img src="{{ image.image.url }}">
{% endfor %}
</div>
{% endfor %}
Если вы хотите сделать первый снимок из набора, вы можете сделать:
{% for item in item.image_set.all %}
{{if forloop.first }}
<img src="{{ item.url }}">
{% endif %}
{% endfor %}
Но я также люблю решение Andray с 'with'
это сработало для меня, используйте родное имя в ваших моделях.
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 %}