Django 如果queryset是单个对象,如何将ListView重定向到DetailView?

Django 如果queryset是单个对象,如何将ListView重定向到DetailView?,django,Django,我有一个带有自定义get_queryset()方法和DetailView的ListView,但我希望在queryset只返回一个对象时避免显示ListView(我希望将用户重定向到该对象的DetailView) 有没有一种方法可以使用基于类的视图来实现这一点?我尝试在ListView的get_queryset()中使用重定向,但它不起作用,并且在ListView类文档中找不到任何有用的内容。您必须调用redirectinsideget: from django.shortcuts import

我有一个带有自定义get_queryset()方法和DetailView的ListView,但我希望在queryset只返回一个对象时避免显示ListView(我希望将用户重定向到该对象的DetailView)


有没有一种方法可以使用基于类的视图来实现这一点?我尝试在ListView的get_queryset()中使用重定向,但它不起作用,并且在ListView类文档中找不到任何有用的内容。

您必须调用
redirect
inside
get

from django.shortcuts import redirect
from django.views.generic import ListView

class MyListView(ListView):
    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset() 
        if queryset.count() == 1:
            return redirect('your_detail_view_url', pk=queryset.first().pk)
        return super().get(request, *args, **kwargs)

我对Ivan的答案做了一些修改(使用
count()
方法是错误的,我还需要在我的DetailView中使用slug而不是pk),因此解决方案是:

from django.shortcuts import redirect
from django.views.generic import ListView

class MyListView(ListView):
    def get(self, request, *args, **kwargs):
        queryset = self.get_queryset() 
        if len(queryset) == 1:
            return redirect('your_detail_view_url', queryset.first().pk)
        return super().get(request, *args, **kwargs)

这违背了restful API的目的。为什么要这样做?我有一个表单,用户可以通过名称或部分名称搜索对象。如果用户搜索部分名称并返回多个结果,我希望向他们显示ListView,但是如果用户搜索确切的名称,我希望将其直接重定向到对象的DetailView。我认为客户端逻辑应该使用list view或detail view来处理。服务器不应该知道这一点。谢谢,这正是我搜索的内容,但我不得不对其进行一些修改:
queryset.count()
需要一个强制参数,即我要在列表中计算的对象,因此我使用了
len(queryset)