基于 Django1.10 文档的深入学习(30)——Class-based views

来源:互联网 发布:java 请求跨域转发 编辑:程序博客网 时间:2024/06/05 20:37

Class-based views基于类的视图

视图是可调用的,它接受请求并返回响应。 这不仅仅是一个功能,而Django提供了一些可以用作视图的类的例子。 这些允许您通过利用继承和混合来构建视图和重用代码。 还有一些简单的任务的一般观点,我们稍后会介绍,但是您可能需要设计自己的可重用视图结构,以适合您的用例。 有关完整的详细信息,请参阅基于类的视图参考文档。

  • 基于类视图的介绍
  • 内置基于类的通用视图
  • 基于类视图的表单处理
  • 使用mixins与基于类视图

Basic examples基本例子

Django提供基本视图类,可以适用于各种应用。 所有视图都继承自View类,它将视图链接到URLHTTP方法调度和其他简单的功能。RedirectView是一个简单的HTTP重定向,TemplateView扩展了基类,使其也可以渲染一个模板。


Simple usage in your URLconf您的URLconf中的简单使用

使用通用视图的最简单方法是直接在URLconf中创建它们。 如果您只是在基于类的视图中更改几个简单属性,则可以简单地将它们传递给as_view()方法调用本身:

from django.conf.urls import urlfrom django.views.generic import TemplateViewurlpatterns = [    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.pyfrom django.views.generic import TemplateViewclass AboutView(TemplateView):    template_name = "about.html"

那么我们只需要将这个新视图添加到我们的URLconf中。TemplateView是一个类,而不是一个函数,所以我们将URL指向as_view()类方法,它为基于类的视图提供了类似函数的条目:

# urls.pyfrom django.conf.urls import urlfrom some_app.views import AboutViewurlpatterns = [    url(r'^about/$', AboutView.as_view()),]

有关如何使用内置泛型视图的更多信息,请参阅下一个基于类的视图主题。


Supporting other HTTP methods支持其他HTTP方法

假设有人想通过HTTP使用视图作为API访问我们的图书库。 API客户端将连接每一个,然后下载上次访问后发布的图书的书籍数据。 但是如果从那以后没有出现新书,那么浪费CPU时间和带宽从数据库中获取图书,呈现完整的响应并将其发送给客户端。 最近出版的书籍最好问API。

我们将URL映射到URLconf中的图书列表视图:

from django.conf.urls import urlfrom books.views import BookListViewurlpatterns = [    url(r'^books/$', BookListView.as_view()),]

And the view:

from django.http import HttpResponsefrom django.views.generic import ListViewfrom books.models import Bookclass 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标头指示最近发布的图书的时间。 基于此信息,客户端可能会也可能不会下载完整的对象列表。

0 0
原创粉丝点击