在我的基于类的通用视图中使用get_queryset()获取TypeError

时间:2011-06-21 06:11:52

标签: django generics views

错误说:

get()只需要2个参数(给定3个)

我将DetailView子类化为:

class MovieDetail(DetailView):
    template_name = 'examples/generic_movie_detail.html'
    template_object_name = 'movie'

    def get_queryset(self):
        movie = get_object_or_404(Movies, actors__name__contains = self.args[0])
        return movie 

并使用url作为:

(r'^movie/detail/(\w+)', MovieDetail.as_view())

现在我想通过任何特定的演员说('Tom')来检索电影,然后我将Tom通过url传递为“/ movie / detail / tom”。我会在我的模板中解决它。

追溯:

File "C:\Python26\lib\site-packages\django\core\handlers\base.py" in get_response
  111.                         response = callback(request, *callback_args, **callback_kwargs)
File "C:\Python26\lib\site-packages\django\views\generic\base.py" in view
  47.             return self.dispatch(request, *args, **kwargs)
File "C:\Python26\lib\site-packages\django\views\generic\base.py" in dispatch
  68.         return handler(request, *args, **kwargs)

异常类型:/ examples / movie / detail / aamir中的TypeError 异常值:get()只需要2个参数(给定3个)

2 个答案:

答案 0 :(得分:1)

当您不接受参数时,您正在通过您的网址捕获组(BaseDetailView.get)传递(\w+)个参数。

class BaseDetailView(SingleObjectMixin, View):
    def get(self, request, **kwargs): #<-- only keyword args

传递关键字参数或覆盖get方法以接受*args或您的特定参数。

答案 1 :(得分:0)

如果您是DetailView的子类,请尝试覆盖get_object而不是get_queryset

编辑:Yuji Tomita的回答似乎是您问题的正确答案,您可能应该使用self.kwargs['name'](r'^movie/detail/(?P<name>\'+)/$', MovieDetail.as_view())

请记住,对于详细视图,您可能希望只收到一个url的结果,并且您应该使用唯一的标识字段和“精确”过滤器而不是使用外键查找并使用“包含” ”