下面三个类提供创建Django 视图所需要的大部分功能。你可以认为它们是能够直接使用或者被继承的父视图。它们不能满足项目中所有的需求,在这种情况下有Mixin 和基于类的通用视图。
Django 许多内建的基于类的视图继承自其它基于类的视图或者各种Mixin。因为继承链非常重要,它们的祖先类会在标题为祖先(MRO) 的小节中显示。MRO 是方法解析顺序(Method Resolution Order) 的缩写。
基于类的基础视图的核心。其它所有的基于类的视图都继承自这个基础类。
方法图谱
示例views.py:
from django.http import HttpResponse
from django.views.generic 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 方法名称。
默认:
['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
方法
返回一个可调用的视图,它接受一个请求并返回一个响应:
response = MyView.as_view()(request)
视图的精髓部分 —— 该方法接受一个request 加上其它参数并返回一个HTTP 响应。
默认的实现是检查HTTP 的方法,然后委托给一个与之匹配的方法;GET 请求将委托给get(), POST 请求给post(),等等。
默认情况下,HEAD 将委托给get()。如果处理HEAD 请求的方式需要与GET 不同,你可以覆盖head() 方法。参见支持其它HTTP 方法中的一个例子。
如果视图被一个它所不支持的HTTP 方法调用,将会调用这个方法。
默认的实现是返回HttpResponseNotAllowed,并带有一个纯文本格式的允许的方法列表。
响应OPTIONS HTTP 请求。返回允许的HTTP 方法列表。
渲染一个给定的模板,其上下文包含从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(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'),
]
上下文
重定向到一个给定的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(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='http://djangoproject.com'), name='go-to-django'),
]
属性
字符串形式的重定向URL。如果为None,则引发一个410 (Gone) HTTP 错误。
重定向的目标URL 模式的名称。将使用与传递给视图的相同位置参数和关键字参数做反查。
重定向是否应该是永久的。唯一的区别是返回的HTTP 状态码。如果为True,那么重定向将使用状态码301。如果为False,那么重定向将使用状态码302。permanent 默认为True。
自1.8版起已弃用:在Django 1.9 中permanent 属性的默认值将从True 改为False。
是否将GET 的查询字符串一起传递给新的地址。如果为True,那么查询字符串将附加到URL 的后面。如果为False,那么查询字符串将被丢弃。query_string 默认为False。
方法
构造重定向的目标URL。
默认的实现使用url 作为开始的字符串并使用% 操作符将URL 中捕获的命名参数替换到字符串中。
如果没有设置url,get_redirect_url() 将反查使用URL 中捕获的参数和命名参数反查pattern_name 。
如果有查询字符串且query_string 为真,它还会将查询字符串添加到生成的URL 的后面。子类可以实现任意行为,只要改方法返回一个可以重定向的URL 字符串。
2015年5月13日