基本视图 — Django 文档
基本视图
以下三个类提供了创建 Django 视图所需的大部分功能。 您可以将它们视为 parent 视图,它们可以被自己使用或继承。 它们可能无法提供项目所需的所有功能,在这种情况下,存在 Mixins 和基于类的 Generic 视图。
许多 Django 内置的基于类的视图继承自其他基于类的视图或各种混合。 因为这个继承链非常重要,祖先类记录在祖先(MRO)的章节标题下。 MRO 是 Method Resolution Order 的首字母缩写词。
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() 被调用。
- 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 方法名称列表。
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)。
您还可以使用 as_view() 的 extra_context 关键字参数添加上下文。
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://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
。
方法
- get_redirect_url(*args, **kwargs)
构造重定向的目标 URL。
args
和kwargs
参数分别是从 URL 模式 中捕获的位置和/或关键字参数 。默认实现使用 url 作为起始字符串,并使用 URL 中捕获的命名组对该字符串中的
%
命名参数进行扩展。如果 url 未设置,
get_redirect_url()
尝试使用 URL 中捕获的内容(使用命名组和未命名组)反转 pattern_name。如果 query_string 请求,它还会将查询字符串附加到生成的 URL。 子类可以实现他们希望的任何行为,只要该方法返回一个可重定向的 URL 字符串。