从类视图中访问请求对象
我有下面这样的代码:
url(r'login$', views.LoginView.as_view(), name='login'),
然后显示的效果是这样的:
class LoginView(TemplateView):
def __init__(self, *args, **kwargs):
#How to operate on request Object's type and its params.
我在代码里已经把我的问题写成了注释。
2 个回答
3
如果你想要初始化变量,最好的地方就是在设置函数(setup function)里:
class SomeBaseView(View):
var1 = None
def setup(self, request, *args, **kwargs):
super().setup(request, *args, **kwargs)
# do the vars initialization here
self.var1 = kwargs.get('param') # e.g.
顺便说一下,设置函数是在调度(dispatch)之前被调用的,而且你不需要像调度那样返回任何东西。
当视图在请求/响应的过程中被调用时,setup() 方法会把 HttpRequest(HTTP请求)赋值给视图的请求属性,同时把从 URL 模式中捕获到的位置参数和关键字参数分别赋值给 args 和 kwargs 属性。然后就会调用 dispatch()。
https://docs.djangoproject.com/en/4.1/ref/class-based-views/base/#django.views.generic.base.View.as_view
另一方面,不推荐使用调度函数(dispatch function),因为你需要返回 super 调用,这样会让事情变得复杂。
6
正如@karthikr提到的,你不应该去重写__init__()
这个方法。请求对象在dispatch()
方法中首次可用,这个方法是在__init__()
之后立即被调用的,但你也不需要重写这个方法。这个方法的主要作用是调用get()
、post()
或者其他相关的方法处理器。不过,通常来说,你也不需要重写这些方法。
不过,如果你真的非常想在最早的时刻捕捉到请求,那么dispatch
方法是最好的选择。
class LoginView(TemplateView):
def dispatch(self, request, *args, **kwargs):
print self.request # Works!
return super(LoginView, self).dispatch(request, *args, **kwargs) # Don't forget this