如何覆盖Django通用基本视图';什么样的调度方式?

如何覆盖Django通用基本视图';什么样的调度方式?,django,Django,如果我编写一个从Django的泛型基视图继承的类,那么重写其分派方法的正确方法是什么?似乎表明它可以被重写,但示例并没有具体说明如何进行重写 如果我这样做 class MyView(View): def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs)

如果我编写一个从Django的泛型基视图继承的类,那么重写其分派方法的正确方法是什么?似乎表明它可以被重写,但示例并没有具体说明如何进行重写

如果我这样做

class MyView(View):
    def dispatch(self, request, *args, **kwargs):
        return super().dispatch(request, *args, **kwargs)

    def get(self, request, *args, **kwargs):
        response = dispatch(request, *args, **kwargs)
        return HttpResponse('Hello, world!')
Django说

NameError: name 'dispatch' is not defined.
RecursionError: maximum recursion depth exceeded
如果我把派遣声明改成这个

response = self.dispatch(request, *args, **kwargs)
Django说

NameError: name 'dispatch' is not defined.
RecursionError: maximum recursion depth exceeded
文档似乎表明它可以被覆盖,但示例并没有具体说明如何覆盖

您可以覆盖每一个方法(除了一些Python内置函数等,但这在这里并不相关)

但是,覆盖
分派
并不常见,因为
分派
基本上是检查请求的方法(获取、发布、修补、放置、删除等),然后覆盖相应的方法
获取
发布
修补
放置
删除
,等等

因此,正如您所发现的,如果在
get()
方法中调用
dispatch()
方法,就会得到一个相互递归的情况。这里
dispatch
将调用
get
get
将调用
dispatch
。这样就可以继续互相调用,直到调用堆栈耗尽为止

在某些情况下,视图会覆盖
dispatch
方法,例如:

class LogoutView(SuccessURLAllowedHostsMixin,TemplateView):
# …
@方法\u装饰器(从不\u缓存)
def调度(自我、请求、*args、**kwargs):
授权注销(请求)
next\u page=self.get\u next\u page()
如果下一页:
#重定向到此页面,直到会话被清除。
返回HttpResponseRedirect(下一页)
return super().dispatch(请求、*args、**kwargs)
这里的
dispatch
方法将确保为给定用户发出
logout
调用。但是
get
方法不会再次调用
dispatch
方法

文档似乎表明它可以被覆盖,但示例并没有具体说明如何覆盖

您可以覆盖每一个方法(除了一些Python内置函数等,但这在这里并不相关)

但是,覆盖
分派
并不常见,因为
分派
基本上是检查请求的方法(获取、发布、修补、放置、删除等),然后覆盖相应的方法
获取
发布
修补
放置
删除
,等等

因此,正如您所发现的,如果在
get()
方法中调用
dispatch()
方法,就会得到一个相互递归的情况。这里
dispatch
将调用
get
get
将调用
dispatch
。这样就可以继续互相调用,直到调用堆栈耗尽为止

在某些情况下,视图会覆盖
dispatch
方法,例如:

class LogoutView(SuccessURLAllowedHostsMixin,TemplateView):
# …
@方法\u装饰器(从不\u缓存)
def调度(自我、请求、*args、**kwargs):
授权注销(请求)
next\u page=self.get\u next\u page()
如果下一页:
#重定向到此页面,直到会话被清除。
返回HttpResponseRedirect(下一页)
return super().dispatch(请求、*args、**kwargs)

这里的
dispatch
方法将确保为给定用户发出
logout
调用。但是
get
方法不会再次调用
dispatch
方法。

为什么在
get
中调用
dispatch
?通常
dispatch
会调用get,因此您会进入一个相互递归的循环,因此会出现错误。首先为什么要覆盖
dispatch
?你能解释一下你的目标吗?阅读,它将改变你的生活我向你保证Willem是对的,
dispatch
将返回get,从get调用它将导致奇怪的递归限制超出例外我没有理由这样做。只是文档似乎暗示这是可以做到的,所以我想了解如何做到。我只是好奇。你为什么在
get
中调用
dispatch
?通常
dispatch
会调用get,因此您会进入一个相互递归的循环,因此会出现错误。首先为什么要覆盖
dispatch
?你能解释一下你的目标吗?阅读,它将改变你的生活我向你保证Willem是对的,
dispatch
将返回get,从get调用它将导致奇怪的递归限制超出例外我没有理由这样做。只是文档似乎暗示这是可以做到的,所以我想了解如何做到。我只是好奇。