适用版本:django1.11
官网地址:https://docs.djangoproject.com/en/1.11/topics/class-based-views/
视图是接收请求并返回响应的可调用函数。 它不仅可以是函数的形式,Django还提供了一些实现视图功能的类。 类视图帮助我们通过继承和mixin来构建视图以重用代码。 django内置一些完成简单任务的通用视图(稍后会介绍),但是开发人员很可能需要设计自己的可重用视图结构来满足开发要求。 详细信息请参阅基类视图参考文档。
- 类视图介绍
- 内置基类通用视图
- 使用类视图处理表单
- 类视图如何使用mixins
基本例子
Django提供适用于大量应用的基本视图类。 所有视图都继承View类,View类实现建立视图与URL的联系、分配HTTP方法和其他的简单特性。 RedirectView是一个简单的HTTP重定向,TemplateView扩展基类实现了渲染模板的功能。
在URLconf中的简单用法
使用通用视图最简单的方法是直接在URLconf中创建它们。如果只更改类视图的一些简单特性,可以直接通过as_view()方法传递:
from django.conf.urls import url
from django.views.generic import TemplateView
urlpatterns = [
url(r'^about/$', TemplateView.as_view(template_name="about.html")),
]
任何传入as_view()的参数都将覆盖类的对应属性。在这个例子中,我们为TemplateView设置了template_name。我们可以采用类似的方法重新设置RedirectView的url属性。
创建通用视图的子类
使用通用视图的第二个方法是继承已存在的类视图,并通过在子类中重写属性(如template_name)或方法(如get_context_data)来提供新的值或方法。比如,一个只展示一个模板(about.html)的视图。Django内置一个可以完成该工作的通用视图(TemplateView),我们可以创建它的子类并覆盖模板名称:
# some_app/views.py
from django.views.generic import TemplateView
class AboutView(TemplateView):
template_name = "about.html"
然后,我们将这个新视图添加到URLconf中就可以了。TemplateView是一个类(不是一个方法),因此我们将URL指向类的as_view()方法,该方法为类视图提供一个函数接口:
# urls.py
from django.conf.urls import url
from some_app.views import AboutView
urlpatterns = [
url(r'^about/$', AboutView.as_view()),
]
使用内置通用视图的更多方法可以参考通用类视图。
支持其他HTTP方法
假设有人想把视图作为通过HTTP访问我们图书馆的API。 每个人都可能随时访问API并下载上次访问后发布的新书的数据。 但是如果从那以后没有新书,那么从数据库中获取图书、呈现完整的响应并将其发送给客户端则是对CPU时间和带宽的浪费。 更好的方法应该是询问API最新的书是什么时候发布的。
我们在URLconf中将图书列表视图映射到URL:
from django.conf.urls import url
from books.views import BookListView
urlpatterns = [
url(r'^books/$', BookListView.as_view()),
]
视图为:
from django.http import HttpResponse
from django.views.generic import ListView
from books.models import Book
class BookListView(ListView):
model = Book
def head(self, *args, **kwargs):
last_book = self.get_queryset().latest('publication_date')
response = HttpResponse('')
# RFC 1123 date format
response['Last-Modified'] = last_book.publication_date.strftime('%a, %d %b %Y %H:%M:%S GMT')
return response
如果通过GET请求访问该视图,响应将返回一个简单的对象列表(使用book_list.html模板)。 但是如果客户端发出HEAD请求,则响应主体为空而Last-Modified指向最新发布的图书的时间。 基于此信息,客户端可能会或者不会下载完整的对象列表。