基础视图
以下三个类提供了创建 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()
。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)
该视图从以下视图继承方法和属性。
django.views.generic.base.TemplateResponseMixin
django.views.generic.base.ContextMixin
django.views.generic.base.View
方法流程图
示例 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://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 字符串。