基本视图

下面三个类提供创建Django 视图所需要的大部分功能。 你可以认为它们是能够直接使用或者被继承的视图。 它们不能满足项目中所有的需求,在这种情况下有Mixin 和基于类的通用视图。

Django 许多内建的基于类的视图继承自其它基于类的视图或者各种Mixin。 因为继承链非常重要,它们的祖先类会在标题为祖先(MRO) 的小节中显示。 MRO 是方法解析顺序(Method Resolution Order) 的缩写。

View

django.views.generic.base。视图 T0> ¶ T1>

基于类的基础视图的核心。 其它所有的基于类的视图都继承自这个基础类。 它不是严格的通用视图,因此也可以从django.views导入。

在Django更改1.10:

django.views导入的功能已添加。

方法流程图

  1. dispatch()
  2. http_method_not_allowed()
  3. options()

示例views.py:

from django.http import HttpResponse
from django.views import View

class MyView(View):

    def get(self, request, *args, **kwargs):
        return HttpResponse('Hello, World!')

示例urls.py:

from django.conf.urls import url

from myapp.views import MyView

urlpatterns = [
    url(r'^mine/$', MyView.as_view(), name='my-view'),
]

属性

http_method_names

该视图接受的HTTP 方法名称。

默认:

['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

方法

类方法 as_view(**initkwargs)

返回一个可调用的视图,它接受一个请求并返回一个响应:

response = MyView.as_view()(request)

返回的视图具有view_classview_initkwargs属性。

当在请求/响应周期中调用视图时,将HttpRequest分配给视图的request属性。 Any positional and/or keyword arguments captured from the URL pattern are assigned to the args and kwargs attributes, respectively. 然后调用dispatch()

dispatch(request, *args, **kwargs)

视图的request部分 —— 该方法接受一个view 加上其它参数并返回一个HTTP 响应。

默认实现将检查HTTP方法,并尝试委托与HTTP方法匹配的方法;将将GET委托给get()POSTpost(),等等。

默认情况下,get() 将委托给HEAD 如果处理head() 请求的方式需要与GET 不同,你可以覆盖HEAD 方法。 参见Supporting other HTTP methods中的一个例子。

http_method_not_allowed(request, *args, **kwargs)

如果视图被一个它所不支持的HTTP 方法调用,将会调用这个方法。

默认的实现是返回HttpResponseNotAllowed,并带有一个纯文本格式的允许的方法列表。

options(request, *args, **kwargs)

响应OPTIONS HTTP 请求。 返回包含视图允许的HTTP方法名称列表的Allow头的响应。

TemplateView

class django.views.generic.base.TemplateView

渲染一个给定的模板,其上下文包含从URL 捕获的参数。

Ancestors (MRO)

该视图从以下视图继承方法和属性:

方法流程图

  1. dispatch()
  2. http_method_not_allowed()
  3. get_context_data()

示例views.py:

from django.views.generic.base import TemplateView

from articles.models import Article

class HomePageView(TemplateView):

    template_name = "home.html"

    def get_context_data(self, **kwargs):
        context = super(HomePageView, self).get_context_data(**kwargs)
        context['latest_articles'] = Article.objects.all()[:5]
        return context

示例urls.py:

from django.conf.urls import url

from myapp.views import HomePageView

urlpatterns = [
    url(r'^$', HomePageView.as_view(), name='home'),
]

上下文

  • 以URL 中捕获的关键字参数填充(通过ContextMixin)。

RedirectView

django.views.generic.base.RedirectView

重定向到一个给定的URL。

给定的URL 可以包含字典形式的字符串格式化形式,它将用URL 中捕获的参数替换。 因为始终 执行关键字形式的替换(即使没有传递参数),URL 中的任何"%" 字符必须写成"%%",这样Python 才会在输出中将它们转换成单个百分号。

如果给定的URL 为HttpResponseGone,Django 将返回一个None (410)。

祖先(MRO)

该视图从以下视图继承方法和属性:

方法流程图

  1. dispatch()
  2. http_method_not_allowed()
  3. get_redirect_url()

示例views.py:

from django.shortcuts import get_object_or_404
from django.views.generic.base import RedirectView

from articles.models import Article

class ArticleCounterRedirectView(RedirectView):

    permanent = False
    query_string = True
    pattern_name = 'article-detail'

    def get_redirect_url(self, *args, **kwargs):
        article = get_object_or_404(Article, pk=kwargs['pk'])
        article.update_counter()
        return super(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)

示例urls.py:

from django.conf.urls import url
from django.views.generic.base import RedirectView

from article.views import ArticleCounterRedirectView, ArticleDetail

urlpatterns = [
    url(r'^counter/(?P<pk>[0-9]+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
    url(r'^details/(?P<pk>[0-9]+)/$', ArticleDetail.as_view(), name='article-detail'),
    url(r'^go-to-django/$', RedirectView.as_view(url='https://djangoproject.com'), name='go-to-django'),
]

属性

url

字符串形式的重定向URL。 如果为None,则引发一个410 (Gone) HTTP 错误。

pattern_name

重定向的目标URL 模式的名称。 将使用与传递给视图的相同位置参数和关键字参数做反查。

permanent

重定向是否应该是永久的。 唯一的区别是返回的HTTP 状态码。 如果为True,那么重定向将使用状态码301。 如果为False,那么重定向将使用状态码302。 默认情况下,permanentFalse

query_string

是否将GET 的查询字符串一起传递给新的地址。 如果为True,那么查询字符串将附加到URL 的后面。 如果为False,那么查询字符串将被丢弃。 False 默认为query_string

方法

get_redirect_url* args** kwargs

构造重定向的目标URL。

默认的实现使用url 作为开始的字符串并使用% 操作符将URL 中捕获的命名参数替换到字符串中。

如果没有设置urlget_redirect_url() 将反查使用URL 中捕获的参数和命名参数反查pattern_name

如果有查询字符串且query_string 为真,它还会将查询字符串添加到生成的URL 的后面。 子类可以实现任意行为,只要改方法返回一个可以重定向的URL 字符串。