2009-08-15 79 views
4

所以問題就出在這裏。想象兩種模式:攝影師和照片。嚴格的規則是,圖片只能有1位攝影師,所以在Photo中有攝影師的ForeignKey鏈接。現在ForeignKey和Django Template


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

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

我想顯示在主頁上最有名的攝影師用3張最流行的他的照片。所以它應該是這樣的:


# 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的手冊,我仔細閱讀,但無法找到答案...

+0

我剛剛添加了一個答案,其實或多或少是你在評論中所說的:-) – 2009-08-15 18:08:02

回答

6

嘗試使用slice filter

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

注意,.all並不需要顯式調用。

+0

這很好用!實際上,我自己發現了一種更通用的方法:向攝影師get_top3photos(self)添加一個方法,它只返回自我。所以在模板中,我可以參考這個新的屬性{%for photographer.top_3_photos%} photo – Vitaly 2009-08-15 17:54:50

+0

是的,將選擇移出模板是你最好的選擇。將其放入視圖或模板標籤中。 – hughdbrown 2009-08-16 19:30:10

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

確保您的視圖包含邏輯,模板只顯示數據。

+0

是的,但我也需要在一個頁面上顯示攝影師的名字......所以它會像「攝影師約翰雨,照片:photo1,photo2,photo3「。 – Vitaly 2009-08-15 17:51:06

2

我覺得尤瓦爾A幾乎有它,但不完全 - 照片和攝影師似乎混在一起。我認爲最好的方法是在Photographer模型上提供top_photos屬性,該屬性返回前3名(或多個)照片。然後:

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

我漏掉了任何HTML在上面的格式,但希望的意圖十分明顯。