Skip to main content

基本视图

以下三个类提供了创建Django视图所需的大部分功能。您可以将它们视为 parent 视图,可以自行使用或继承。他们可能不提供项目所需的所有功能,在这种情况下有Mixins和通用基于类的视图。

Django的许多内置的基于类的视图继承自其他基于类的视图或各种混合。因为这个继承链是非常重要的,祖先类被记录在 祖先(MRO) 的标题下。 MRO是Method Resolution Order的缩写。

View

class django.views.generic.base.View

基于主类的基本视图。所有其他基于类的视图继承此基本类。它不是严格的通用视图,因此也可以从 django.views 导入。

Changed in Django 1.10:

添加了从 django.views 导入的能力。

方法流程图

  1. dispatch()

  2. http_method_not_allowed()

  3. options()

示例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']

方法

classmethod as_view(**initkwargs)

返回接受请求并返回响应的可调用视图:

response = MyView.as_view()(request)
New in Django 1.9.

返回的视图具有 view_classview_initkwargs 属性。

dispatch(request, *args, **kwargs)

视图的 view 部分 - 接受 request 参数和参数的方法,并返回HTTP响应。

默认实现将检查HTTP方法,并尝试委派给与HTTP方法匹配的方法; GET 将被委派给 get()POSTpost(),等等。

默认情况下,HEAD 请求将委派给 get()。如果您需要以与 GET 不同的方式处理 HEAD 请求,则可以覆盖 head() 方法。参见 支持其他HTTP方法 的例子。

http_method_not_allowed(request, *args, **kwargs)

如果使用HTTP方法调用视图不支持,则调用此方法。

默认实现返回 HttpResponseNotAllowed,其中包含纯文本中允许的方法列表。

options(request, *args, **kwargs)

处理响应对OPTIONS HTTP动词的请求。返回一个包含视图允许的HTTP方法名称列表的 Allow 头的响应。

TemplateView

class django.views.generic.base.TemplateView

呈现给定的模板,其中上下文包含在URL中捕获的参数。

祖先(MRO)

此视图从以下视图继承方法和属性:

方法流程图

  1. dispatch()

  2. http_method_not_allowed()

  3. get_context_data()

示例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

class django.views.generic.base.RedirectView

重定向到指定的URL。

给定的URL可以包含字典样式的字符串格式,其将针对URL中捕获的参数进行插值。因为关键字插值是 always 完成的(即使没有传入任何参数),URL中的任何 "%" 字符必须写为 "%%",以便Python将它们转换为输出上的单个百分号。

如果给定的URL是 None,Django将返回 HttpResponseGone (410)。

祖先(MRO)

此视图从以下视图继承方法和属性:

方法流程图

  1. dispatch()

  2. http_method_not_allowed()

  3. get_redirect_url()

示例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

要重定向到的网址,作为字符串。或 None 引发410(Gone)HTTP错误。

pattern_name

要重定向到的网址格式的名称。将使用与为此视图传递的相同的args和kwargs进行倒置。

permanent

重定向是否应该是永久的。这里唯一的区别是返回的HTTP状态代码。如果 True,则重定向将使用状态代码301.如果 False,则重定向将使用状态代码302.默认情况下,permanentFalse

Changed in Django 1.9:

permanent 属性的默认值从 True 更改为 False

query_string

是否将GET查询字符串传递到新位置。如果是 True,则将查询字符串附加到URL。如果是 False,那么查询字符串将被丢弃。默认情况下,query_stringFalse

方法

get_redirect_url(*args, **kwargs)

构造重定向的目标网址。

默认实现使用 url 作为起始字符串,并使用URL中捕获的命名组在该字符串中执行 % 命名参数的扩展。

如果未设置 urlget_redirect_url() 将尝试使用URL中捕获的内容(使用命名组和未命名组)来反转 pattern_name

如果 query_string 请求,它还会将查询字符串附加到生成的URL。子类可以实现他们想要的任何行为,只要该方法返回一个重定向就绪的URL字符串。