---
title: "基础视图"
version: 5.1
locale: zh-hans
source: https://docs.djangoproject.com/zh-hans/5.1/ref/class-based-views/base/
canonical: https://djangodocs.dev/zh-hans/5.1/ref/class-based-views/base/
---
# 基础视图

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

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

## `View`

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

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

**方法流程图**

1. [`setup()`](#django.views.generic.base.View.setup)
2. [`dispatch()`](#django.views.generic.base.View.dispatch)
3. [`http_method_not_allowed()`](#django.views.generic.base.View.http_method_not_allowed)
4. [`options()`](#django.views.generic.base.View.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()`](#django.views.generic.base.View.setup) 方法将 [`HttpRequest`](/zh-hans/5.1/ref/request-response/#django.http.HttpRequest) 分配给视图的 `request` 属性，将任何位置和／或关键字参数 [从 URL 模式](/zh-hans/5.1/topics/http/urls/#how-django-processes-a-request) 中捕获的参数分别分配给 `args` 和 `kwargs` 属性。然后调用 [`dispatch()`](#django.views.generic.base.View.dispatch)。

如果一个 `View` 子类定义了异步（`async def`）方法处理程序，`as_view()` 将把返回的可调用对象标记为协程函数。如果在单个视图类上同时定义了异步（`async def`）和同步（`def`）处理程序，将会引发 `ImproperlyConfigured` 异常。

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

在 [`dispatch()`](#django.views.generic.base.View.dispatch) 之前执行关键视图初始化。

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

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

视图的 `view` 部分 -- 接受 `request` 参数加参数的方法，并返回 HTTP 响应。

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

默认情况下，`HEAD` 请求将被委托给 `get()`。如果你需要以不同于 `GET` 的方式处理 `HEAD` 请求，你可以覆盖 `head()` 方法。参见 [支持其他 HTTP 方法](/zh-hans/5.1/topics/class-based-views/#supporting-other-http-methods) 的例子。

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

如果视图被调用的 HTTP 方法不支持，就会调用这个方法代替。

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

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

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

如果类上的其他 HTTP 方法处理程序是异步的（`async def`），那么响应将被包装在一个协程函数中，以便与 `await` 一起使用。

## `TemplateView`

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

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

**祖先（MRO）**

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

- [`django.views.generic.base.TemplateResponseMixin`](/zh-hans/5.1/ref/class-based-views/mixins-simple/#django.views.generic.base.TemplateResponseMixin)
- [`django.views.generic.base.ContextMixin`](/zh-hans/5.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin)
- [`django.views.generic.base.View`](#django.views.generic.base.View)

**方法流程图**

1. [`setup()`](#django.views.generic.base.View.setup)
2. [`dispatch()`](#django.views.generic.base.View.dispatch)
3. [`http_method_not_allowed()`](#django.views.generic.base.View.http_method_not_allowed)
4. [`get_context_data()`](/zh-hans/5.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.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`](/zh-hans/5.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin)）从服务于视图的 URL 模式中捕获的关键字参数。
- 你也可以使用 [`extra_context`](/zh-hans/5.1/ref/class-based-views/mixins-simple/#django.views.generic.base.ContextMixin.extra_context) 关键字参数为 [`as_view()`](#django.views.generic.base.View.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`](#django.views.generic.base.View)

**方法流程图**

1. [`setup()`](#django.views.generic.base.View.setup)
2. [`dispatch()`](#django.views.generic.base.View.dispatch)
3. [`http_method_not_allowed()`](#django.views.generic.base.View.http_method_not_allowed)
4. [`get_redirect_url()`](#django.views.generic.base.RedirectView.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 模式](/zh-hans/5.1/topics/http/urls/#how-django-processes-a-request) 中获取。

默认实现使用 [`url`](#django.views.generic.base.RedirectView.url) 作为起始字符串，并使用 URL 中捕获的命名组对该字符串中的 `%` 命名参数进行扩展。

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

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