Django 如果queryset是单个对象,如何将ListView重定向到DetailView?
我有一个带有自定义get_queryset()方法和DetailView的ListView,但我希望在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
有没有一种方法可以使用基于类的视图来实现这一点?我尝试在ListView的get_queryset()中使用重定向,但它不起作用,并且在ListView类文档中找不到任何有用的内容。您必须调用
redirect
insideget
:
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)
。