基础视图

以下三个类提供了创建 Django 视图所需的大部分功能。您可以将它们视为视图,可以单独使用或从中继承。它们可能无法提供项目所需的所有功能,在这种情况下,可以使用 Mixin 和通用基于类的视图。

Django 的许多内置基于类的视图都继承自其他基于类的视图或各种 mixin。由于此继承链非常重要,因此祖先类在祖先 (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

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

默认值

["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()

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

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

如果类上的其他 HTTP 方法处理程序是异步的 (async def),则响应将包装在协程函数中以与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"),
]

上下文

  • 使用 URL 模式中捕获的关键字参数填充 (通过ContextMixin),这些参数用于服务视图。

  • 您还可以使用extra_context关键字参数为as_view()添加上下文。

RedirectView

class django.views.generic.base.RedirectView

重定向到给定的 URL。

给定的 URL 可能包含字典风格的字符串格式化,这些格式化内容将根据 URL 中捕获的参数进行插值。由于关键字插值 *始终* 进行(即使没有传递任何参数),因此 URL 中的任何 "%" 字符都必须写成 "%%",以便 Python 在输出时将其转换为单个百分号。

如果给定的 URL 为 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://djangopy.cn/"),
        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,则查询字符串将被丢弃。默认情况下,query_stringFalse

方法

get_redirect_url(*args, **kwargs)

构建重定向的目标 URL。

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

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

如果未设置 url,则 get_redirect_url() 将尝试使用 URL 中捕获的内容反向解析 pattern_name(使用命名和未命名组)。

如果 query_string 请求,它还将查询字符串附加到生成的 URL。子类可以实现任何它们希望的行为,只要该方法返回一个可重定向的 URL 字符串即可。

返回顶部