Class-based views基于类的视图
视图是可调用的,它接受请求并返回响应。 这不仅仅是一个功能,而Django提供了一些可以用作视图的类的例子。 这些允许您通过利用继承和混合来构建视图和重用代码。 还有一些简单的任务的一般观点,我们稍后会介绍,但是您可能需要设计自己的可重用视图结构,以适合您的用例。 有关完整的详细信息,请参阅基于类的视图参考文档。
- 基于类视图的介绍
- 内置基于类的通用视图
- 基于类视图的表单处理
- 使用mixins与基于类视图
Basic examples基本例子
Django提供基本视图类,可以适用于各种应用。 所有视图都继承自View
类,它将视图链接到URL
,HTTP
方法调度和其他简单的功能。RedirectView
是一个简单的HTTP重定向,TemplateView
扩展了基类,使其也可以渲染一个模板。
Simple usage in your URLconf您的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属性。
Subclassing generic views子类化通用视图
使用通用视图的第二个更强大的方法是从现有视图继承并覆盖子类中的属性(如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()),
]
有关如何使用内置泛型视图的更多信息,请参阅下一个基于类的视图主题。
Supporting other HTTP methods支持其他HTTP方法
假设有人想通过HTTP使用视图作为API访问我们的图书库。 API客户端将连接每一个,然后下载上次访问后发布的图书的书籍数据。 但是如果从那以后没有出现新书,那么浪费CPU时间和带宽从数据库中获取图书,呈现完整的响应并将其发送给客户端。 最近出版的书籍最好问API。
我们将URL映射到URLconf中的图书列表视图:
from django.conf.urls import url
from books.views import BookListView
urlpatterns = [
url(r'^books/$', BookListView.as_view()),
]
And the 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
标头指示最近发布的图书的时间。 基于此信息,客户端可能会也可能不会下载完整的对象列表。