可以在基于Django类的视图中设置实例变量吗?

For*_*ter 27 python django django-class-based-views

我尝试了Django的基于类的视图(CBV).

class BlahView(TemplateView):
    template_name = 'blah/blah.html'
    def get_context_data(self, **kwargs):
        #code...

    def get(self, request, **kwargs):
        #more code...
Run Code Online (Sandbox Code Playgroud)

现在,我知道我可以从self.request获得请求参数.现在说我要解析这些请求参数并将它们存储在类中.我可以存放self.xxx吗?现在,显然基于类的工作方式,这看起来很简单.

但我无法弄清楚控制的流程,看看View(超类TemplateView)的定义.该提到as_view()是"入口点"

我想在开头设置我的实例变量get_context_data()但是在那里进行初始化似乎不对.

我可以__init__()为我的CBV 定义一个吗?如果是这样,是否存在线程问题或多个页面访问可能与我的解析数据的全局实例一起工作?

我知道这听起来有点混乱,但我只是对CBV中的代码流感到困惑.

jpi*_*pic 46

django.views.generic.base.View.as_view:

  • 在Django的启动,as_view()返回一个函数view,它
  • 在请求,view() 被调用,它实例化类和调用dispatch()
  • 类实例是线程安全的

django.views.generic.base.View.__init__,请求对象超出范围在这一点上,所以你不能在自己的构造函数重载解析它.

但是,你可以解析请求并在重载中设置类视图实例属性,django.views.generic.base.View.dispatch根据来源这是安全的:

class YourView(SomeView):
    def dispatch(self, request, *args, **kwargs):
        # parse the request here ie.
        self.foo = request.GET.get('foo', False)

        # call the view
        return super(YourView, self).dispatch(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,[Django的CBV文档(https://docs.djangoproject.com/en/1.3/ref/class-based-views/#generic-views)明确地说,在实例存储状态变量是线程安全的,所以我们不仅仅依赖于我们对源代码的阅读. (5认同)