34

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

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

    def get(self, request, **kwargs):
        #more code...

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

View但是看(超类)的定义,我无法弄清楚控制流TemplateView消息来源提到是“as_view()入口点”

我想在开始时设置我的实例变量,get_context_data()但在那里进行初始化似乎不正确。

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

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

4

2 回答 2

56

根据来源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)
于 2012-07-12T09:31:14.397 回答
2

@jpic 提供了一个很好的答案。受此启发,我想参考以下博客文章,其中作者声称:

...我们不能覆盖视图,因为这样做需要覆盖 as_view()。重写 dispatch() 很有吸引力(以及我最初在演讲时所做的),因为它提供了一个简单的地方来执行此操作,但这违背了 dispatch() 的逻辑。相反,最好在 get() 和 post() 的覆盖中调用 set_account()。...

因此,可以覆盖getorpost方法并设置任何self.whatever变量。感觉有点干净。

于 2016-10-18T14:59:36.027 回答