Переопределение get_queryset () в Django DetailView - PullRequest
6 голосов
/ 19 июня 2011

У меня есть две модели, City и State с State, являющимся отношением ForeignKey для City.My CityDetailView url построен как:

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

Мой CityDetailView, вызываемый по указанному выше URL-адресу:

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 (), чтобы отфильтровать только модели City в одном состоянии, но, похоже, он не работает, что странно, потому что мой CityListView похож, но работает нормально. Будем благодарны за любые мысли о том, чего мне не хватает.

Ответы [ 2 ]

10 голосов
/ 24 декабря 2013

Вам нужно переопределить метод 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
1 голос
/ 19 июня 2011

Я получаю сообщение об ошибке в функции get_context_data, потому что там я не фильтровал список городов, а не объект основного вида.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...