视图类dispatch()找不到方法?

时间:2018-08-30 09:26:29

标签: django django-forms django-views

我正在尝试将单个网址用于两个视图。我在django官方文档中找到了一个示例。我有这样的东西:

class DetailOrderView(View):
    """Combines form and detail parts into one and in darkness binds                                                                                  
    them."""

    # import pdb; pdb.set_trace()                                                                                                                     

    def get(self, request, *args, **kwargs):
        view = DisplayDetailOrderView.as_view()                                                                                                     
        return view(self, *args, **kwargs)                                                                                                          

    def post(self, request, *args, **kwargs):
        view = FormDetailOrderView.as_view()
        return view(self, *args, **kwargs)

在urls.py中,我指的是DetailOrderView.as_view()

但是,当我尝试运行此命令时,出现此错误:

.... lib/python3.6/site-packages/django/views/generic/base.py", line 84, in dispatch
if request.method.lower() in self.http_method_names:
AttributeError: 'DetailOrderView' object has no attribute 'method'

这基本上意味着dispatch(self, request, *args, **kwargs)尝试调用request.method.lower()时会发现该请求没有属性method!哪一个有点奇怪?

请求应该在as_view()中定义吗?

这是官方文档中的大部分c / p,它应该可以工作,所以我必须做一些愚蠢的事情。

1 个答案:

答案 0 :(得分:1)

您是正确的,首先需要使用.as_view(),但是您打电话给view  以self作为第一个参数。 view函数的第一个参数是请求,因此:

class DetailOrderView(View):
    """Combines form and detail parts into one and in darkness binds
    them."""

    def get(self, request, *args, **kwargs):
        view = DisplayDetailOrderView.as_view()
        return view(request, *args, **kwargs)  # no self

    def post(self, request, *args, **kwargs):
        view = FormDetailOrderView.as_view()
        return view(request, *args, **kwargs)  # no self

请注意,这仍然可能会出错,因为例如如果DisplayDetailOrderView具有其他URL参数,则该视图可能无法正确处理数据。

尽管从技术上来说可以调用另一种视图,但这并不是很常见。