直接在Django的模板中访问外键集

zbq4xfa0  于 2023-02-17  发布在  Go
关注(0)|答案(5)|浏览(129)

我有一个简化的模型:

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

但很明显这是不可能的,至少不能直接从模板中获取。
获得模板内第一个图像的等价物的正确方法是什么?

u1ehiz5o

u1ehiz5o1#

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

inn6fuwd2#

或者,您可以向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 }}">

但是如果你需要更多的灵活性(在某些情况下不止一张图片,等等),最好写一个小的templatag。

rt4zxlrg

rt4zxlrg3#

一种可能的方法是像这样迭代所有的ItemImage

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

u1ehiz5o4#

这对我很有效,请在模型中使用related_name

    • 型号. 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")
    • 建筑物. html**
{% for space in building.spaces_of_this_building.all %}
  {{ space.title }}
{% endfor %}
rggaifut

rggaifut5#

如果您想从设置的第一张图片,您可以:

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

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

{% endfor %}

但我也喜欢Andray解决方案中的with

相关问题