基础视图¶
以下三个类提供了创建 Django 视图所需的大部分功能。你可以把它们看作是 父 类的视图,它们可以自己使用,也可以从父类继承。它们可能无法提供项目所需的所有功能,在这种情况下,有基于类的混入和通用视图。
Django 内置的许多基于类的视图都是从其他基于类的视图或各种混入中继承过来的。因为这个继承链非常重要,所以祖先类被记录在 祖先(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¶
此视图将接受的 HTT P方法名称列表。
默认:
["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()之前执行关键视图初始化。Assigns the
HttpRequestto the view'srequestattribute, and any positional and/or keyword arguments captured from the URL pattern to theargsandkwargsattributes, respectively.如果覆盖这个方法,必须调用
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 方法不支持,就会调用这个方法代替。
The default implementation returns
HttpResponseNotAllowedwith the list of allowed methods in theAllowheader, as required by RFC 7231. The response body is empty.
- 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"), ]
上下文
填充(通过
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)
这个视图从以下的视图中继承了方法和属性:
方法流程图
示例 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。
- preserve_request¶
- New in Django 6.1.
Whether to preserve the HTTP method and body during the redirect. If
True, then the redirect will use status code 307 instead of 302, or 308 instead of 301 whenpermanentisTrue. By default,preserve_requestisFalse.
方法
- get_redirect_url(*args, **kwargs)¶
构建用于重定向的目标 URL。
args和kwargs参数分别是位置参数和/或关键字参数 从 URL 模式 中获取。默认实现使用
url作为起始字符串,并使用 URL 中捕获的命名组对该字符串中的%命名参数进行扩展。如果没有设置
url,get_redirect_url()尝试使用 URL 中捕获的内容来反推pattern_name(命名组和未命名组都会使用)。如果被
query_string请求,它也会将查询字符串附加到生成的 URL 中。子类可以实现任何他们想要的行为,只要该方法返回一个重定向就绪的 URL 字符串。