2011-06-18 1 views
5

をget_querysetの上書きが構築される:上記URLによって呼び出さマイCityDetailViewがあるとして、私は国がCity.My CityDetailViewのURLのForeignKeyの関係という2つのモデル、市と州を持っているジャンゴDetailView中)(

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

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 

マイ・シティ・モデルには、各都市ごとに固有の名前があります。 2つの州で発生した都市にアクセスしようとすると、get()が複数の都市を返したというエラーが発生します。私は単一の状態でCityモデルのみをフィルタリングするためにget_queryset()メソッドをオーバーライドしようとしていますが、私のCityListViewは似ているがうまく動作しているために奇妙な動作をしていないようです。私が紛失しているものについての考えは高く評価されます。

答えて

0

get_context_data関数でエラーが発生しました。なぜなら、プライマリビューオブジェクト上に都市リストをフィルタリングしていなかったからです。

+1

笑確かに適切な順序:)にあなたのリストをフィルタリングするために覚えておくことが良いでしょう。州の都市を取得するには、州ごとに都市リストをフィルタリングする必要があります。このようにすることができれば/そうしたい場合は、urlパラメータで多くのことを行うこともできます。 – eusid

7

これを行うにはget_objectDetailViewに上書きする必要があります。

このような何かを行う必要があります

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 
関連する問題