← 自定义存储 | 总目录 | 内置显示视图 →
视图是可调用的,能接受用户的请求并返回响应。视图远不只是个函数,Django提供了一些可用作视图的类的示例,允许你通过继承和复用构建自己的视图并且复用这些代码。虽然接下来还会介绍一些用于简单任务的通用视图,但你可能想自己设计可复用的视图结构,以便针对某些特殊场景。详情请见 基于类的视图参考文档。
Django提供适合各种应用程序的基本视图类。所有视图都继承自View类,该类处理将视图链接到URL,HTTP方法调度和其他简单功能。RedirectView用于简单的HTTP重定向,TemplateView 扩展基类以使其也呈现模板。
使用通用视图的最简单方法是直接在URLconf中创建它们。如果您只是在基于类的视图上更改一些简单属性,则可以将它们简单地传递给 as_view()方法调用本身:
from django.urls import path
from django.views.generic import TemplateView
urlpatterns = [
path('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.urls import path
from some_app.views import AboutView
urlpatterns = [
path('about/', AboutView.as_view()),
]
有关如何使用内置通用视图的更多信息,请参阅有关 基于类的通用视图。
假设某人想要使用视图作为API来通过HTTP访问我们的图书库。API客户端会不时地连接并下载自上次访问以来发布的书籍的书籍数据。但是,如果从那以后没有出现新书,那么从数据库中获取书籍,呈现完整的响应并将其发送给客户端会浪费CPU时间和带宽。在最新出版的书出版时,最好询问API。
我们将URL映射到URLconf中的book list视图:
from django.urls import path
from books.views import BookListView
urlpatterns = [
path('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
响应头指示最近发布的书籍的时间。根据此信息,客户端可能会也可能不会下载完整的对象列表。