2011-06-18 132 views
5

我有兩個型號,市和國家與國家是City.My CityDetailView URL的一個ForeignKey關係被構造爲:重寫get_queryset()一個Django的DetailView

r'^state/(?P<state>[-\w]+)/city/(?P<slug>[-\w]+)/$' 

我CityDetailView通過上面的網址被稱爲是:

class CityDetailView(DetailView): 
    model = City 
    context_object_name = 'city' 
    template_name = 'location/city_detail.html' 

    def get_queryset(self): 
     state = get_object_or_404(State, slug__iexact=self.kwargs['state']) 
     return City.objects.filter(state=state) 

    def get_context_data(self, **kwargs): 
     context = super(CityDetailView, self).get_context_data(**kwargs) 
     city = City.objects.get(slug__iexact=self.kwargs['slug']) 
     context['guide_list'] = Guide.objects.filter(location=city).annotate(Count('review'), Avg('review__rating')) 
     return context 

我的城市模型爲每個城市都有獨特的名稱。如果我嘗試訪問發生在兩個州的城市,我會得到一個錯誤,即get()返回多個城市。我試圖重寫get_queryset()方法來過濾只在一個單一的狀態城市模型,但它似乎並沒有工作,這是奇怪的,因爲我的CityListView是相似的,但工作正常。任何關於我失蹤的想法將不勝感激。

回答

0

我得到了get_context_data函數的錯誤,因爲我沒有在主視圖對象上過濾城市列表。

+1

哈哈的確這將是一個好主意,記得要篩選適當的順序:)你的列表。要獲得某個州的城市,您應該按州來過濾城市列表。如果你可以/想這樣做,你甚至可以用url params來做很多事情。 – eusid

7

您需要覆蓋DetailView中的方法get_object來執行此操作。

像這樣的東西應該做的:

class CityDetailView(DetailView): 
    model = City 
    context_object_name = 'city' 
    template_name = 'location/city_detail.html' 

    def get_object(self): 
     state = get_object_or_404(State, slug__iexact=self.kwargs['state']) 
     return self.model.objects.filter(state=state) 

    def get_context_data(self, **kwargs): 
     context = super(CityDetailView, self).get_context_data(**kwargs) 
     cities = self.object 
     context['guide_list'] = Guide.objects.filter(location=cities).annotate(Count('review'), Avg('review__rating')) 
     return context