2011-06-18 22 views
5

Tôi có hai mô hình, Thành phố và Nhà nước với nhà nước là một mối quan hệ ForeignKey của City.My CityDetailView url được xây dựng như:get_queryset Overriding() trong một Django DetailView

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

CityDetailView tôi gọi bằng url trên là :

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ô hình thành phố của tôi có tên duy nhất cho mỗi thành phố. Nếu tôi cố gắng và truy cập một thành phố xảy ra ở hai bang, tôi nhận được một lỗi rằng get() trả về nhiều hơn một thành phố. Tôi đang cố gắng để ghi đè lên get_queryset() phương pháp để lọc ra chỉ các mô hình thành phố trong một tiểu bang duy nhất nhưng nó dường như không được làm việc đó là lẻ vì CityListView của tôi là tương tự nhưng hoạt động tốt. Bất kỳ suy nghĩ về những gì tôi đang mất tích sẽ được đánh giá cao.

Trả lời

0

Tôi đã gặp lỗi trên hàm get_context_data vì tôi không lọc danh sách thành phố không có trên đối tượng xem chính.

+1

haha ​​thực sự nó sẽ là một ý tưởng tốt để nhớ để lọc danh sách theo thứ tự thích hợp :). để có được các thành phố trong một tiểu bang, bạn nên lọc danh sách thành phố của bạn theo tiểu bang. bạn thậm chí có thể làm được nhiều thứ với thông số url nếu bạn có thể/muốn thực hiện theo cách này. – eusid

7

Bạn cần ghi đè phương thức get_object trong DetailView để thực hiện việc này.

Something như thế này nên làm:

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