覆盖Django DetailView中的get_queryset()

the*_*eve 6 django-views django-class-based-views

我有两个模型,城市和州,国家是City的ForeignKey关系.我的CityDetailView网址构造如下:

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

我上面的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
Run Code Online (Sandbox Code Playgroud)

我的城市模型为每个城市都有唯一的名称.如果我尝试访问一个发生在两个州的城市,我会收到一个错误,即get()返回了多个城市.我试图覆盖get_queryset()方法只过滤掉单个状态的城市模型,但它似乎没有工作,这是奇怪的,因为我的CityListView相似,但工作正常.任何关于我失踪的想法都会受到赞赏.

小智 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
Run Code Online (Sandbox Code Playgroud)

  • get_queryset() 和 get_object() 在他们的工作中有什么区别? (2认同)

the*_*eve 1

我在 get_context_data 函数上收到错误,因为我没有过滤主视图对象上的城市列表。