基本视图

以下三个类提供了创建Django视图所需的大部分功能。你可能认为他们是 起源 视图,可以由自己使用或从中继承。它们可能无法提供项目所需的所有功能,在这种情况下,存在混合和基于类的通用视图。

Django的许多基于类的内置视图继承自其他基于类的视图或各种混合。因为这个继承链非常重要,所以祖先类被记录在 Ancestors (MRO) . MRO是方法解析顺序的缩写。

View

class django.views.generic.base.View

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

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. options()

示例视图.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"),
]

Attributes

http_method_names

此视图将接受的HTTP方法名称列表。

违约::

["get", "post", "put", "patch", "delete", "head", "options", "trace"]

Methods

classmethod as_view(**initkwargs)

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

response = MyView.as_view()(request)

返回的视图 view_classview_initkwargs 属性。

在请求/响应周期中调用视图时, setup() 方法分配 HttpRequest 眺望风景 request 属性和任何位置和/或关键字参数 captured from the URL patternargskwargs 属性。然后 dispatch() 被称为。

如果一个 View 子类定义了异步 (async def )方法处理程序, as_view() 将返回的可调用标记为协程函数。一个 ImproperlyConfigured 如果两者都是异步的,则将引发异常 (async def )和同步 (def )处理程序定义在单个视图类上。

setup(request, *args, **kwargs)

执行键视图初始化之前 dispatch() .

如果重写此方法,则必须调用 super() .

dispatch(request, *args, **kwargs)

这个 view 视图的一部分--接受 request 参数加上参数,并返回一个HTTP响应。

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

默认情况下,A HEAD 请求将委托给 get() . 如果你需要处理 HEAD 请求的方式与 GET ,您可以重写 head() 方法。见 支持其他HTTP方法 举个例子。

http_method_not_allowed(request, *args, **kwargs)

如果该视图是使用它不支持的HTTP方法调用的,则改为调用该方法。

默认实现返回 HttpResponseNotAllowed 以纯文本形式列出允许的方法。

options(request, *args, **kwargs)

处理对选项HTTP谓词请求的响应。返回带有 Allow 包含视图允许的HTTP方法名称列表的头。

如果类上的其他HTTP方法处理程序是异步的 (async def ),则响应将被包装在协程函数中以用于 await

TemplateView

class django.views.generic.base.TemplateView

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

Ancestors (MRO)

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

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. get_context_data()

示例视图.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"),
]

Context

RedirectView

class django.views.generic.base.RedirectView

重定向到给定的URL。

给定的URL可能包含字典样式的字符串格式,这些字符串格式将根据URL中捕获的参数进行插值。因为关键字插值是 总是 完成(即使没有参数传入),任何 "%" URL中的字符必须写入为 "%%" 这样,Python就可以将它们转换为单一的登录输出。

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

Ancestors (MRO)

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

方法流程图

  1. setup()

  2. dispatch()

  3. http_method_not_allowed()

  4. get_redirect_url()

示例视图.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://www.djangoproject.com/"),
        name="go-to-django",
    ),
]

Attributes

url

作为字符串重定向到的URL。或 None 引发410(消失)HTTP错误。

pattern_name

要重定向到的URL模式的名称。反转将使用与此视图相同的args和kwargs来完成。

permanent

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

query_string

是否将get查询字符串传递到新位置。如果 True ,然后将查询字符串附加到URL。如果 False ,则放弃查询字符串。默认情况下, query_stringFalse .

Methods

get_redirect_url(*args, **kwargs)

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

这个 argskwargs 参数是位置参数和/或关键字参数 captured from the URL pattern ,分别。

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

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

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