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

时间:2011-06-02 16:57:43

标签: 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)

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

items = Item.objects.all()

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

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

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

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

5 个答案:

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