# Django 3.2.11.dev 文档

# 基础视图

以下三个类提供了创建 Django 视图所需的大部分功能。你可以把它们看作是 父 类的视图，它们可以自己使用，也可以从父类继承。它们可能无法提供项目所需的所有功能，在这种情况下，有基于类的混入和通用视图。

Django 内置的许多基于类的视图都是从其他基于类的视图或各种混入中继承过来的。因为这个继承链非常重要，所以祖先类被记录在 祖先（MRO） 节标题下。MRO 是方法解析顺序的缩写。

## `View`

class `django.views.generic.base.``View`

  基于主类的基本视图。所有其他基于类的视图都继承自这个基类。它并不是严格意义上的通用视图，因此也可以从 `django.views` 导入。

  方法流程图

  1. `setup()`
  2. `dispatch()`
  3. `http_method_not_allowed()`
  4. `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.urls import path

      from myapp.views import MyView

      urlpatterns = [
          path('mine/', MyView.as_view(), name='my-view'),
      ]

  属性

  `http_method_names`

    此视图将接受的 HTT P方法名称列表。

    默认：

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

  方法

  classmethod `as_view`(**initkwargs)

    返回一个接受请求并返回响应的可调用对象视图：

        response = MyView.as_view()(request)

    返回的视图有 `view_class` 和 `view_initkwargs` 属性。

    当视图在请求／响应周期中被调用时， `setup()` 方法将 `HttpRequest` 分配给视图的 `request` 属性，将任何位置和／或关键字参数 从 URL 模式 中捕获的参数分别分配给 `args` 和 `kwargs` 属性。然后调用 `dispatch()`。

  `setup`(request, *args, **kwargs)

    在 `dispatch()` 之前执行关键视图初始化。

    如果覆盖这个方法，必须调用 `super()`。

  `dispatch`(request, *args, **kwargs)

    视图的 `view` 部分——该方法接受 `request` 参数和其他参数，并返回 HTTP 响应。

    默认的实现将检查 HTTP 方法，并尝试委托给与 HTTP 方法相匹配的方法；`GET` 将委托给 `get()`，`POST` 将委托给 `post()`，以此类推。

    默认情况下，`HEAD` 请求将被委托给 `get()`。如果你需要以不同于 `GET` 的方式处理 `HEAD` 请求，你可以覆盖 `head()` 方法。参见 支持其他 HTTP 方法 的例子。

  `http_method_not_allowed`(request, *args, **kwargs)

    如果调用视图时使用了它不支持的 HTTP 方法，就会调用这个方法。

    默认的实现返回 `HttpResponseNotAllowed`，其中包含一个纯文本的允许方法列表。

  `options`(request, *args, **kwargs)

    处理响应 OPTIONS HTTP 动词的请求。返回一个包含 `Allow` 头的响应，该头包含一个视图允许的 HTTP 方法名称列表。

## `TemplateView`

class `django.views.generic.base.``TemplateView`

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

  祖先（MRO）

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

  - `django.views.generic.base.TemplateResponseMixin`
  - `django.views.generic.base.ContextMixin`
  - `django.views.generic.base.View`

  方法流程图

  1. `setup()`
  2. `dispatch()`
  3. `http_method_not_allowed()`
  4. `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().get_context_data(**kwargs)
              context['latest_articles'] = Article.objects.all()[:5]
              return context

  示例 urls.py：

      from django.urls import path

      from myapp.views import HomePageView

      urlpatterns = [
          path('', HomePageView.as_view(), name='home'),
      ]

  上下文

  - 填充（通过 `ContextMixin`）从服务于视图的 URL 模式中捕获的关键字参数。
  - 你也可以使用 `extra_context` 关键字参数为 `as_view()` 添加上下文。

## `RedirectView`

class `django.views.generic.base.``RedirectView`

  重定向到给定的 URL。

  给定的 URL 可能包含字典式的字符串格式，将对 URL 中捕获的参数进行插值。因为关键字插值 总是 进行的（即使没有参数传递进来），URL 中的任何 `"%"` 字符必须写成 `"%%"`，这样 Python 就会在输出中把它们转换为一个百分号。

  如果给定的 UR L是 `None`，Django 将返回一个 `HttpResponseGone` （410）。

  祖先（MRO）

  这个视图从以下的视图中继承了方法和属性：

  - `django.views.generic.base.View`

  方法流程图

  1. `setup()`
  2. `dispatch()`
  3. `http_method_not_allowed()`
  4. `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().get_redirect_url(*args, **kwargs)

  示例 urls.py：

      from django.urls import path
      from django.views.generic.base import RedirectView

      from article.views import ArticleCounterRedirectView, ArticleDetailView

      urlpatterns = [
          path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
          path('details/<int:pk>/', ArticleDetailView.as_view(), name='article-detail'),
          path('go-to-django/', RedirectView.as_view(url='https://www.djangoproject.com/'), name='go-to-django'),
      ]

  属性

  `url`

    要重定向到的 URL，作为一个字符串。或者 `None` 引发 410（Gone）HTTP 错误。

  `pattern_name`

    要重定向到的 URL 模式的名称。重定向将使用与此视图传递的相同的 args 和 kwargs 来完成。

  `permanent`

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

  `query_string`

    是否将 GET 查询字符串传递到新位置。如果 True`，那么查询字符串将被附加到 URL 中。如果 `False`，那么查询字符串将被丢弃。默认情况下，`query_string` 是 `False`。

  方法

  `get_redirect_url`(*args, **kwargs)

    构建用于重定向的目标 URL。

    `args` 和 `kwargs` 参数分别是位置参数和／或关键字参数 从 URL 模式 中获取。

    默认实现使用 `url` 作为起始字符串，并使用 URL 中捕获的命名组对该字符串中的 `%` 命名参数进行扩展。

    如果没有设置 `url`，`get_redirect_url()` 尝试使用 URL 中捕获的内容来反推 `pattern_name` （命名组和未命名组都会使用）。

    如果被 `query_string` 请求，它也会将查询字符串附加到生成的 URL 中。子类可以实现任何他们想要的行为，只要该方法返回一个重定向就绪的 URL 字符串。