ForeignKey和Django模板

时间:2009-08-15 17:24:33

标签: django templates collections

所以这就是问题所在。想象一下2个模特:摄影师和照片。严格的规则是只有1名摄影师可以获得图像,所以在Photo中有一个ForeignKey链接到摄影师。


class Photographer(models.Model):
    name = models.CharField(max_length = 40)

class Photo(models.Model):
    name = models.CharField(max_length = 40)
    photographer = models.ForeignKey(Photographer)

现在我想在主页上展示大多数着名摄影师,他的照片最受欢迎。所以它应该是这样的:


# views.py
def main(request):
    photographers = ...
    return render_to_response("main_page.html", {
                "photographers": photographers
           })

#main_page.html
{% for photo in photographers.photo_set.all()[:3] %}
{{ photo.name }}
{% endfor %}

但是Django模板系统不允许all()和[:3]。那么最好的方法是什么?最明显的解决方案是动态创建对象(从摄影师和照片创建数组并将其传递给模板),但我认为这不是一个好方法。

请不要只是把我推荐给Django手册,我仔细阅读,但找不到答案......

3 个答案:

答案 0 :(得分:6)

尝试使用slice filter

{% for photo in photographers.photo_set.all|slice:":3" %}

请注意,.all不需要显式调用。

答案 1 :(得分:2)

我觉得Yuval A几乎得到了它,但并不完全 - 照片和摄影师似乎混在了一起。我认为最好的方法是在top_photos模型上提供Photographer属性,该属性返回前3张(或多张)照片。然后:

{% for photographer in photographers %}
Photographer: {% photographer.name %}
Top Photos:
{% for photo in photographer.top_photos %}
{% photo.name}
{% endfor %}
{% endfor %}

我在上面遗漏了任何HTML格式,但希望意图很明确。

答案 2 :(得分:1)

你知道了,你只需要将逻辑移动到视图中,并在获得对象后将模板传递给模板。

# views.py
def main(request):
    photographers = photographers.photo_set.all()[:3]
    return render_to_response("main_page.html", {
                "photographers": photographers
           })

#main_page.html
{% for photo in photographers %}
{{ photo.name }}
{% endfor %}

确保您的视图包含逻辑,模板只显示数据。