如何覆盖Django通用基本视图';什么样的调度方式?
如果我编写一个从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)
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调用它将导致奇怪的递归限制超出例外我没有理由这样做。只是文档似乎暗示这是可以做到的,所以我想了解如何做到。我只是好奇。