【问题标题】:Getting TypeError using get_queryset() in my Class Based Generic Views在基于类的通用视图中使用 get_queryset() 获取 TypeError
【发布时间】:2011-06-21 15:00:21
【问题描述】:

错误说:

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 

并将网址用作:

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

现在我想检索任何特定演员说 ('Tom') 的电影,然后我将通过 URL 将 Tom 作为 "/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 个)

【问题讨论】:

    标签: django generics views


    【解决方案1】:

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

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

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

    【讨论】:

    • 嘿,Yuji,谢谢。我是使用 Django Generic Views 的新手。你能详细说明一下具体应该做什么吗?
    • 你需要重写 get 方法来接受参数 - 比如 def get(self, request, w_arg): return http.HttpResponse(w_arg) (它的工作方式与普通视图函数完全一样)。
    【解决方案2】:

    如果您要继承 DetailView,请尝试覆盖 get_object 而不是 get_queryset

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

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

    【讨论】:

    • 您能否将完整的回溯添加到您的问题中?
    • 您的型号名称是Movie 还是Movies
    • 仍在尝试找出问题
    • 我知道我应该使用精确过滤器,因为 DetailView 用于单个对象。
    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2011-11-10
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-31
    • 2016-08-06
    相关资源
    最近更新 更多