基础视图

以下三个类提供了创建 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_classview_initkwargs 属性。

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

If a View subclass defines asynchronous (async def) method handlers, as_view() will mark the returned callable as a coroutine function. An ImproperlyConfigured exception will be raised if both asynchronous (async def) and synchronous (def) handlers are defined on a single view-class.

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 方法名称列表。

If the other HTTP methods handlers on the class are asynchronous (async def) then the response will be wrapped in a coroutine function for use with await.

TemplateView

class django.views.generic.base.TemplateView

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

祖先(MRO)

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

方法流程图

  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)

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

方法流程图

  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。默认情况下,permanentFalse

query_string

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

方法

get_redirect_url(*args, **kwargs)

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

argskwargs 参数分别是位置参数和/或关键字参数 从 URL 模式 中获取。

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

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

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