2011-06-18 8 views
5

mam dwa modele, miasto i stan ze stanem bycia relacja ForeignKey z City.My CityDetailView URL jest skonstruowany jako:Zastępowanie get_queryset() w Django DetailView

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

Moja CityDetailView nazywany przez powyższy adres URL jest :

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 

Mój model miasta ma unikalne nazwy dla każdego miasta. Jeśli spróbuję uzyskać dostęp do miasta, które występuje w dwóch stanach, pojawia się błąd, że get() zwrócił więcej niż jedno miasto. Próbuję zastąpić metodę get_queryset(), aby odfiltrować tylko modele City w jednym stanie, ale wydaje się, że nie działa, co jest dziwne, ponieważ mój CityListView jest podobny, ale działa dobrze. Wszelkie przemyślenia na temat tego, czego mi brakuje, zostaną docenione.

Odpowiedz

0

Otrzymałem błąd w funkcji get_context_data, ponieważ nie filtrowałem listy miast nie w głównym obiekcie widoku.

+1

haha ​​rzeczywiście byłby to dobry pomysł, aby pamiętać, aby filtrować listę w odpowiedniej kolejności :). aby uzyskać miasta w stanie, należy filtrować listę miast według stanu. możesz nawet zrobić wiele z jego parametrami URL, jeśli możesz/chciałeś to zrobić w ten sposób. – eusid

7

Aby to zrobić, należy zastąpić metodę get_object w DetailView.

Coś jak to powinno zrobić:

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 
Powiązane problemy