说是完结,马上又开始写进阶篇了。
本章不会为博客项目增加新功能,但是也同样重要,因为我们要学习高逼格的基于类的视图。
什么是类视图
前面章节中写的所有视图都是基于函数的,即def
;而类视图是基于类的,即class
。
有编程基础的同学都知道,类是面向对象技术中非常重要的概念。具有复杂数据、功能的类,可以通过继承轻而易举的将自身特性传递给另一个类,从而实现代码的高效复用。
相比以前的函数视图,类视图有以下优势:
- HTTP方法(
GET
,POST
等)相关的代码,可以通过方法而不是条件分支来组织 - 可以通过诸如mixins(多重继承)之类的面向对象技术将代码分解为可重用组件
说的都是什么意思?通过例子来感受一下。
列表
函数和类
假设我们有一个博客列表,列表既有GET方法、又有POST方法,那么用视图函数看起来像这样:
views.py
def article_list_example(request):
"""处理GET请求"""
if request.method == 'GET':
articles = ArticlePost.objects.all()
context = {
'articles': articles}
return render(request, 'article/list.html', context)
而在类视图中,则变为这样:
views.py
from django.views import View
class ArticleListView(View):
"""处理GET请求"""
def get(self, request):
articles = ArticlePost.objects.all()
context = {
'articles': articles}
return render(request, 'article/list.html', context)
从本质上讲,基于类的视图允许你使用不同的类实例方法(即上面的def get()
)响应不同的HTTP请求方法,而不需要使用条件分支代码。这样做的好处是把不同的HTTP请求都分离到独立的函数中,逻辑更加清晰,并且方便复用。
需要注意的是,因为Django的URL解析器希望将请求发送到函数而不是类,所以类视图有一个 as_view()
方法,该方法返回一个函数,当请求匹配关联模式的URL时,则调用该函数。
即,视图函数的url原本写为:
urls.py
...
urlpatterns =