以下三个类提供了创建 Django 视图所需的大部分功能。你可以把它们看作是 父 类的视图,它们可以自己使用,也可以从父类继承。它们可能无法提供项目所需的所有功能,在这种情况下,有基于类的混入和通用视图。
Django 内置的许多基于类的视图都是从其他基于类的视图或各种混入中继承过来的。因为这个继承链非常重要,所以祖先类被记录在 祖先(MRO) 节标题下。MRO 是方法解析顺序的缩写。
View
¶对于基本视图类,所有的基于类的视图都要继承这个基类。它并不是严格意义上的通用视图,因此也可以从``django.views``导入。
方法流程图
示例 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"),
]
属性
此视图将接受的 HTT P方法名称列表。
默认:
["get", "post", "put", "patch", "delete", "head", "options", "trace"]
方法
返回一个接受请求并返回响应的可调用对象视图:
response = MyView.as_view()(request)
返回的视图有 view_class
和 view_initkwargs
属性。
当视图在请求/响应周期中被调用时, setup()
方法将 HttpRequest
分配给视图的 request
属性,将任何位置和/或关键字参数 从 URL 模式 中捕获的参数分别分配给 args
和 kwargs
属性。然后调用 dispatch()
。
如果一个 View
子类定义了异步(async def
)方法处理程序,as_view()
将把返回的可调用对象标记为协程函数。如果在单个视图类上同时定义了异步(async def
)和同步(def
)处理程序,将会引发 ImproperlyConfigured
异常。
在 dispatch()
之前执行关键视图初始化。
Assigns the HttpRequest
to the view's request
attribute, and any positional and/or keyword arguments
captured from the URL pattern
to the args
and kwargs
attributes, respectively.
如果覆盖这个方法,必须调用 super()
。
视图的 view
部分 -- 接受 request
参数加参数的方法,并返回 HTTP 响应。
默认的实现将检查 HTTP 方法,并尝试委托给与 HTTP 方法相匹配的方法;GET
将委托给 get()
,POST
将委托给 post()
,以此类推。
默认情况下,HEAD
请求将被委托给 get()
。如果你需要以不同于 GET
的方式处理 HEAD
请求,你可以覆盖 head()
方法。参见 支持其他 HTTP 方法 的例子。
如果视图被调用的 HTTP 方法不支持,就会调用这个方法代替。
默认的实现返回 HttpResponseNotAllowed
,其中包含一个纯文本的允许方法列表。
处理响应 OPTIONS HTTP 动词的请求。返回一个包含 Allow
头的响应,该头包含一个视图允许的 HTTP 方法名称列表。
如果类上的其他 HTTP 方法处理程序是异步的(async def
),那么响应将被包装在一个协程函数中,以便与 await
一起使用。
TemplateView
¶渲染一个给定的模板,其上下文包含 URL 中捕获的参数。
祖先(MRO)
该视图从以下视图继承方法和属性。
方法流程图
示例 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
¶重定向到给定的 URL。
给定的 URL 可能包含字典式的字符串格式,将对 URL 中捕获的参数进行插值。因为关键字插值 总是 进行的(即使没有参数传递进来),URL 中的任何 "%"
字符必须写成 "%%"
,这样 Python 就会在输出中把它们转换为一个百分号。
如果给定的 UR L是 None
,Django 将返回一个 HttpResponseGone
(410)。
祖先(MRO)
这个视图从以下的视图中继承了方法和属性:
方法流程图
示例 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,作为一个字符串。或者 None
引发 410(Gone)HTTP 错误。
要重定向到的 URL 模式的名称。重定向将使用与此视图传递的相同的 args 和 kwargs 来完成。
重定向是否应该是永久的。这里唯一的区别是返回的 HTTP 状态码。如果 True
,那么重定向将使用状态码 301。如果 False
,那么重定向将使用状态码 302。默认情况下,permanent
是 False
。
是否将 GET 查询字符串传递到新位置。如果 True
,那么查询字符串将被附加到 URL 中。如果 False
,那么查询字符串将被丢弃。默认情况下,query_string
是 False
。
方法
构建用于重定向的目标 URL。
args
和 kwargs
参数分别是位置参数和/或关键字参数 从 URL 模式 中获取。
默认实现使用 url
作为起始字符串,并使用 URL 中捕获的命名组对该字符串中的 %
命名参数进行扩展。
如果没有设置 url
,get_redirect_url()
尝试使用 URL 中捕获的内容来反推 pattern_name
(命名组和未命名组都会使用)。
如果被 query_string
请求,它也会将查询字符串附加到生成的 URL 中。子类可以实现任何他们想要的行为,只要该方法返回一个重定向就绪的 URL 字符串。
4月 27, 2025