2011-11-02 100 views
4

我們有一個Django DetailView,我們正在顯示一個對象(Site)及其所有相關對象(Rooms)。Django - 在模板中過濾RelatedManager _set

現在,在模板中,我們可以簡單地在RelatedManager集迭代:

{% for room in site.room_set.all %} 
    do stuff 
{% endfor %} 

然而,這樣做的問題是,這將拿起所有相關房間的網站 - 然而,我們需要通過另一個屬性(我們稱之爲year)將此設置縮小一些 - 並且此屬性存儲在Django會話變量中。

目前,我們只是在視圖代碼中使用Room.objects.filter(site=some_site, year='2009'),這很好。

我的問題更多來自好奇心 - 有沒有什麼辦法在模板中使用_set,並仍然過濾或縮小集合?

您可以編寫一個自定義模型管理器來執行此操作,以便_set只會返回當前年份的對象嗎?或者有其他方法嗎?

乾杯, 維克多

回答

2

我的問題是從好奇更多 - 有沒有辦法使用_set在 模板,仍然下滲或縮小集?

不是默認情況下,因爲沒有辦法將參數傳遞給過濾器調用。

  • 如果它是需要重複的功能可變,常和相關模板:建立一個自定義模板標籤和過濾器(可以接受參數)。
  • 如果它是特定於視圖的功能,請在視圖中對其進行編碼。
  • 如果它的功能在多個視圖中相同,請在乾燥的地方構建函數。

對於#3,有很多因素決定了代碼的位置,因此沒有通用的解決方案。你可以在你的視圖中導入一個函數?使用模特經理?模型實例方法?情境處理器?等

你可以寫一個自定義模型管理器來做到這一點,以便_set將 只返回當前年份的對象?還是有其他一些 的方式?

它看起來像你實際上可以通過使用模型管理器爲您的反向相關模型。

class RoomManager(models.Manager): 
    def current_year(self): 
     return self.get_queryset().filter(year=datetime.date.today().year) 

for room in site.room_set.current_year(): 
    ... 

或者只是父模型:

class Site(models.Model): 
    ... 
    def year_room_set(self): 
     return self.room_set.filter(year=datetime.date.today().year)