基本视图 — Django 文档

来自菜鸟教程
Django/docs/2.2.x/ref/class-based-views/base
跳转至:导航、​搜索

基础视图

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

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

View

class django.views.generic.base.View

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

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. 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.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_classview_initkwargs 属性。

在请求/响应周期中调用视图时,setup() 方法将 HttpRequest 分配给视图的 request 属性,以及任何位置和/或关键字参数 分别从 URL 模式 捕获到 argskwargs 属性。 然后 dispatch() 被调用。

setup(request, *args, **kwargs)

2.2 版中的新功能。

dispatch() 之前初始化视图实例属性:self.requestself.argsself.kwargs

覆盖此方法允许 mixin 设置实例属性以在子类中重用。 重写此方法时,必须调用 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)

该视图从以下视图继承方法和属性。

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. 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().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)

这个视图从以下的视图中继承了方法和属性:

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. 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().get_redirect_url(*args, **kwargs)

示例 urls.py

from django.urls import path
from django.views.generic.base import RedirectView

from article.views import ArticleCounterRedirectView, ArticleDetail

urlpatterns = [
    path('counter/<int:pk>/', ArticleCounterRedirectView.as_view(), name='article-counter'),
    path('details/<int:pk>/', ArticleDetail.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。 默认情况下,permanentFalse

query_string

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

方法

get_redirect_url(*args, **kwargs)

构建用于重定向的目标 URL。

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

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

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