下面三个类提供创建Django 视图所需要的大部分功能。 你可以认为它们是能够直接使用或者被继承的父视图。 它们不能满足项目中所有的需求,在这种情况下有Mixin 和基于类的通用视图。
Django 许多内建的基于类的视图继承自其它基于类的视图或者各种Mixin。 因为继承链非常重要,它们的祖先类会在标题为祖先(MRO) 的小节中显示。 MRO 是方法解析顺序(Method Resolution Order) 的缩写。
View
¶django.views.generic.base。
视图 T0> ¶ T1>
基于类的基础视图的核心。 其它所有的基于类的视图都继承自这个基础类。 它不是严格的通用视图,因此也可以从django.views
导入。
从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.conf.urls import url
from myapp.views import MyView
urlpatterns = [
url(r'^mine/$', MyView.as_view(), name='my-view'),
]
属性
http_method_names
¶该视图接受的HTTP 方法名称。
默认:
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
方法
as_view(**initkwargs)
返回一个可调用的视图,它接受一个请求并返回一个响应:
response = MyView.as_view()(request)
返回的视图具有view_class
和view_initkwargs
属性。
当在请求/响应周期中调用视图时,将HttpRequest
分配给视图的request
属性。 Any positional and/or keyword arguments captured from
the URL pattern are assigned to the
args
and kwargs
attributes, respectively. 然后调用dispatch()
。
dispatch
(request, *args, **kwargs)¶视图的request
部分 —— 该方法接受一个view
加上其它参数并返回一个HTTP 响应。
默认实现将检查HTTP方法,并尝试委托与HTTP方法匹配的方法;将将GET
委托给get()
,POST
到post()
,等等。
默认情况下,get()
将委托给HEAD
。
如果处理head()
请求的方式需要与GET
不同,你可以覆盖HEAD
方法。 参见Supporting other HTTP methods中的一个例子。
http_method_not_allowed
(request, *args, **kwargs)¶如果视图被一个它所不支持的HTTP 方法调用,将会调用这个方法。
默认的实现是返回HttpResponseNotAllowed
,并带有一个纯文本格式的允许的方法列表。
options
(request, *args, **kwargs)¶响应OPTIONS HTTP 请求。 返回包含视图允许的HTTP方法名称列表的Allow
头的响应。
TemplateView
¶django.views.generic.base.
TemplateView
¶渲染一个给定的模板,其上下文包含从URL 捕获的参数。
Ancestors (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(HomePageView, self).get_context_data(**kwargs)
context['latest_articles'] = Article.objects.all()[:5]
return context
示例urls.py:
from django.conf.urls import url
from myapp.views import HomePageView
urlpatterns = [
url(r'^$', HomePageView.as_view(), name='home'),
]
上下文
ContextMixin
)。RedirectView
¶django.views.generic.base.
RedirectView
¶重定向到一个给定的URL。
给定的URL 可以包含字典形式的字符串格式化形式,它将用URL 中捕获的参数替换。 因为始终 执行关键字形式的替换(即使没有传递参数),URL 中的任何"%"
字符必须写成"%%"
,这样Python 才会在输出中将它们转换成单个百分号。
如果给定的URL 为HttpResponseGone
,Django 将返回一个None
(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(ArticleCounterRedirectView, self).get_redirect_url(*args, **kwargs)
示例urls.py:
from django.conf.urls import url
from django.views.generic.base import RedirectView
from article.views import ArticleCounterRedirectView, ArticleDetail
urlpatterns = [
url(r'^counter/(?P<pk>[0-9]+)/$', ArticleCounterRedirectView.as_view(), name='article-counter'),
url(r'^details/(?P<pk>[0-9]+)/$', ArticleDetail.as_view(), name='article-detail'),
url(r'^go-to-django/$', RedirectView.as_view(url='https://djangoproject.com'), 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
,那么查询字符串将被丢弃。 False
默认为query_string
。
方法
get_redirect_url
(* args,** kwargs)¶构造重定向的目标URL。
默认的实现使用url
作为开始的字符串并使用%
操作符将URL 中捕获的命名参数替换到字符串中。
如果没有设置url
,get_redirect_url()
将反查使用URL 中捕获的参数和命名参数反查pattern_name
。
如果有查询字符串且query_string
为真,它还会将查询字符串添加到生成的URL 的后面。
子类可以实现任意行为,只要改方法返回一个可以重定向的URL 字符串。
2017年9月6日