在Django中直接访问ForeignKey设置模板

Yuv*_*dam 28 django django-models

我有这个简化的模型:

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)
Run Code Online (Sandbox Code Playgroud)

一个Item可以有很多ItemImages.我还有一个模板从视图中呈现以下数据集:

items = Item.objects.all()
Run Code Online (Sandbox Code Playgroud)

所以现在我想在模板中做这样的事情:

{% for item in items %}
<div>
    {{ item.name }}<br>
    <img src="{{ item.itemimage_set.all()[0] }}">
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但显然这是不可能的.至少不是直接来自模板.

获取模板中第一个图像的正确方法是什么?

And*_*eev 54

{% with item.itemimage_set.all|first as image %}
  <img src="{{ image.url }}" />
{% endwith %} 
Run Code Online (Sandbox Code Playgroud)


ari*_*rie 13

或者您可以为Item模型添加方法:

def get_first_image(self):
    return self.itemimage_set.all()[0]
Run Code Online (Sandbox Code Playgroud)

然后在模板中调用此方法:

{{ item.get_first_image }}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用:

{{ item.itemimage_set.all.0 }}
Run Code Online (Sandbox Code Playgroud)

并获得第一个图像的网址:

<img src="{{ item.itemimage_set.all.0.url }}">
Run Code Online (Sandbox Code Playgroud)

虽然如果你需要更多的灵活性(在某些情况下不止一张图片等),最好写一个小模板标签.


Yuv*_*dam 7

一种可能的方法是迭代所有ItemImages,如下所示:

{% for item in items %}
<div>
    {{ item.name }}<br>
    {% for image in item.itemimage_set.all %}
    <img src="{{ image.image.url }}">
    {% endfor %}
</div>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)