¶ Django基于类的视图策略
在这篇文章中,我们将详细探讨 Django 中基于类的视图(简称 CBV
)。
我们将重构⼀些现有的视图,以便利⽤内置的基于类的通⽤视图( Generic Class-Based Views
)。
¶ 视图策略
所有的Django视图其实都是函数。即便是 CBV。在类的底层,它完成了所有的功能并最终返回⼀个视图函数。
引⼊基于类的视图,使开发⼈员可以更轻松地重新使⽤和扩展视图。使⽤它们有很多好处,例如可扩展性,多重继承之类的⾯向对象技术的运⽤,HTTP ⽅法的处理是在单独的⽅法中完成的,⽽不是使⽤条件分⽀,并且还有通⽤的基于类的视图(简称 GCBV
)。
重点条目:
- 基于函数的视图(
FBV
) - 基于类的视图(
CBV
) - 基于类的通用视图(
GCBV
)
**FBV
**是Django视图中最简单的表示:它就是⼀个接收 HttpRequest
对象并返回⼀个 HttpResponse
的函数。
**CBV
**是每个Django视图都被定义为⼀个扩展 django.views.generic.view
抽象类后的 Python 类。
**GCBV
**是可以解决⼀些具体问题的内置的 CBV
集合,⽐如列表视图,创建,更新和删除视图等。
下面是一些不同实现方式的例子。
¶ 基于函数的视图(FBV)
¶ views.py
1 | def new_post(request): |
¶ urls.py
1 | urlpatterns = [ |
¶ 基于类的视图(CBV)
CBV
是View 类
的集成类。这⾥的主要区别在于请求是以 HTTP ⽅法命名的类⽅法内处理的,例如GET ,POST ,PUT ,HEAD 等。
所以,在这⾥,我们不需要做⼀个条件来判断请求是⼀个 POST 还是它是⼀个 GET 。代码会直接跳转到正确的⽅法中。在 View 类
中内部处理了这个逻辑。
¶ views.py
1 | from django.views.generic import View |
¶ urls.py
1 | urlpatterns = [ |
在这⾥,我们需要调⽤ as_view()
这个类⽅法,它将返回⼀个符合 url模式视图函数 。在某些情况下,我们也可以将⼀些键字参数传递给 as_view()
,以便⾃定义 CBV 的⾏为,就像我们⽤⼀些身份验证视图来定制模板⼀样。
总之,关于 CBV 的好处是我们可以在类⾥⾯添加更多的⽅法,也许可以这样做:
1 | from django.views.generic import View |
还可以创建⼀些通⽤视图来完成⼀些任务,以便我们可以在整个项⽬中重复利⽤它。
¶ 基于类的通用视图(GCBV)
接下来关于 GCBV
。这是⼀个不同的视图。正如我前⾯提到的, GCBV 是内置 CBV 的常⻅⽤例。它们的实现往往会⼤量使⽤多重继承(混合继承)
和其他⾯向对象的策略。他们⾮常灵活,可以节省很多的⼯作量。但是⼀开始可能相对⽐较难上⼿。
起初,很难说出发⽣了什么,因为代码执⾏流程看起来并不明显,因为在⽗类中隐藏了⼤量代码。官⽅⽂档也有⼀定的难度,主要是因为属性和⽅法有时分布在⼋个⽗类中。
使⽤ GCBV 时,最好打开 ccbv.co.uk (需科学上⽹) 以便快速参考。
现在我们来看⼀个 GCBV 的例⼦。
¶ views.py
1 | from django.views.generic import CreateView |
这⾥我们使⽤了⼀个⽤于创建模型对象的通⽤视图。它会处理所有表单处理并在表单有效时保存对象。
因为它是⼀个 CBV,所以我们在 urls.py
中以与其他 CBV 相同的⽅式来引⽤它:
¶ urls.py
1 | urlpatterns = [ |
GCBV 中的其他例⼦还有:detailview,deleteview,formview,updateview,listview。
(未完待续)