Подтвердить что ты не робот

Доступ к ForeignKey установлен непосредственно в шаблоне в Django

У меня есть эта упрощенная модель:

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 %}

Но, очевидно, это невозможно. Не из шаблона напрямую, по крайней мере.

Каков правильный способ получить эквивалент первого изображения внутри шаблона?

4b9b3361

Ответ 1

{% with item.itemimage_set.all|first as image %}
  <img src="{{ image.url }}" />
{% endwith %} 

Ответ 2

Или вы можете добавить метод к своей модели 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.

Ответ 3

Одним из возможных способов было бы перебрать все ItemImage так:

{% for item in items %}
<div>
    {{ item.name }}<br>
    {% for image in item.itemimage_set.all %}
    <img src="{{ image.image.url }}">
    {% endfor %}
</div>
{% endfor %}

Ответ 4

Если вы хотите сделать первый снимок из набора, вы можете сделать:

{% for item in item.image_set.all %}

{{if forloop.first }}
<img src="{{ item.url }}">
{% endif %}

{% endfor %}

Но я также люблю решение Andray с 'with'

Ответ 5

это сработало для меня, используйте родное имя в ваших моделях.

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 %}