基础视图¶
以下三个类提供了创建 Django 视图所需的大部分功能。您可以将它们视为父视图,可以单独使用或从中继承。它们可能无法提供项目所需的所有功能,在这种情况下,可以使用 Mixin 和通用基于类的视图。
Django 的许多内置基于类的视图都继承自其他基于类的视图或各种 mixin。由于此继承链非常重要,因此祖先类在祖先 (MRO)部分标题下有说明。MRO 是方法解析顺序的首字母缩写。
View
¶
- class django.views.generic.base.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"), ]
属性
- http_method_names¶
此视图将接受的 HTTP 方法名称列表。
默认值
["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()
。如果
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)
此视图继承以下视图的方法和属性
方法流程图
示例 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)
此视图继承自以下视图的方法和属性
方法流程图
示例 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。默认情况下,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 字符串即可。