我try 了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的超类)的定义,我无法理解控制流程.这source个人提到as_view()是"入口点"

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

我能为我的CBV定义一个__init__()吗?

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

推荐答案

根据django.views.generic.base.View.as_view个人中的the source个人的说法:

  • on django startup,as_view()返回一个函数view,该函数被not调用
  • on requestview()is called,它实例化类并调用dispatch()
  • 类实例是线程安全的

根据django.views.generic.base.View.__init__中的第the source条,Request对象此时超出范围,因此您不能在自己的构造函数重载中解析它.

但是,您可以解析请求,并在django.views.generic.base.View.dispatch重载中设置类视图实例属性,根据source:

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)

Django相关问答推荐

Django REST framework:object has no attributed after annotation;Got attributeError when try to get a value for field field on serializer<>

查询在对象中使用django查询与一个包含句子

如何在创建对象后立即运行一次代码?

在Django中提交表单后更改模型数据

如何连接到 docker 容器中的 postgres 数据库?

Playframework 和 Django

django 创建多种类型用户的最佳方法

如何判断 Python unicode 字符串是否包含非西方字母?

Django - 如何在其管理模块中访问模型的详细名称?

relation "django_site" does not exist

Python 和 Django OperationalError (2006, 'MySQL server has gone away')

如何在 Django 测试框架中修改会话

始终将用户包含在 django 模板上下文中

Django - 无法为具有动态 upload_to 值的 ImageField 创建迁移

__init__() 得到了一个意外的关键字参数user

使用直通模型了解 Django 中的多对多字段

RemovedInDjango18Warning:不推荐创建没有fields属性或 exclude属性的 ModelForm

基于 User-Agent 更改 Django 模板

Django 模型(1054,Unknown column in 'field list')

Django 测试 - 在所有测试中修补对象