2011-06-18 9 views
5

Tengo dos modelos, ciudad y estado de ser Estado una relación de ForeignKey City.My CityDetailView url se construye como:get_queryset Anulación() en una Django DetailView

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

Mi CityDetailView llamado por el URL anterior es :

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 

Mi modelo de ciudad tiene nombres únicos para cada ciudad. Si intento acceder a una ciudad que aparece en dos estados, aparece un error que indica que get() devolvió más de una ciudad. Estoy intentando anular el método get_queryset() para filtrar solo los modelos City en un solo estado, pero parece que no funciona, lo cual es extraño porque mi CityListView es similar pero funciona bien. Cualquier comentario sobre lo que me falta sería apreciado.

Respuesta

0

Estaba obteniendo el error en la función get_context_data porque no estaba filtrando la lista de ciudades allí, no en el objeto de vista principal.

+1

jaja De hecho, sería una buena idea para recordar para filtrar la lista en el orden apropiado :). para obtener ciudades en un estado, debe filtrar su lista de ciudades por estado. incluso podrías hacer mucho con parametros de URL si pudieras o quisieras hacerlo de esta manera. – eusid

7

Debe sobrescribir el método get_object en DetailView para hacerlo.

Algo como esto debería hacer:

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 
Cuestiones relacionadas