6

CityとStateの2つのモデルがあり、StateはCityのForeignKeyリレーションです。CityDetailViewのURLは次のように構成されています。

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

上記のURLで呼び出される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

My Cityモデルには、都市ごとに一意の名前があります。2つの州で発生する都市にアクセスしようとすると、get()が複数の都市を返したというエラーが発生します。get_queryset()メソッドをオーバーライドして、単一の状態のCityモデルのみをフィルターで除外しようとしていますが、CityListViewは類似していますが正常に機能するため、機能していないようです。私が欠けているものについての考えはありがたいです。

4

2 に答える 2

10

get_objectこれを行うには、DetailViewのメソッドをオーバーライドする必要があります。

このようなことをする必要があります:

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
于 2013-12-24T13:02:16.463 に答える
1

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

于 2011-06-19T08:14:34.840 に答える