以下三个类提供了创建Django视图所需的大部分功能。你可能认为他们是 起源 视图,可以由自己使用或从中继承。它们可能无法提供项目所需的所有功能,在这种情况下,存在混合和基于类的通用视图。
Django的许多基于类的内置视图继承自其他基于类的视图或各种混合。因为这个继承链非常重要,所以祖先类被记录在 Ancestors (MRO) . MRO是方法解析顺序的缩写。
View
¶基视图类。所有其他基于类的视图都继承自此基类。它不是严格意义上的通用视图,因此也可以从 django.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"),
]
Attributes
此视图将接受的HTTP方法名称列表。
违约::
["get", "post", "put", "patch", "delete", "head", "options", "trace"]
Methods
返回接受请求并返回响应的可调用视图::
response = MyView.as_view()(request)
返回的视图 view_class
和 view_initkwargs
属性。
在请求/响应周期中调用视图时, setup()
方法分配 HttpRequest
眺望风景 request
属性和任何位置和/或关键字参数 captured from the URL pattern 到 args
和 kwargs
属性。然后 dispatch()
被称为。
如果一个 View
子类定义了异步 (async def
)方法处理程序, as_view()
将返回的可调用标记为协程函数。一个 ImproperlyConfigured
如果两者都是异步的,则将引发异常 (async def
)和同步 (def
)处理程序定义在单个视图类上。
在执行键视图初始化之前 dispatch()
。
如果重写此方法,您必须调用 super()
。
这个 view
视图的一部分--接受 request
参数加上参数,并返回一个HTTP响应。
默认实现将检查HTTP方法并尝试委托给与HTTP方法匹配的方法;a GET
将委托给 get()
,A POST
到 post()
等等。
默认情况下,A HEAD
请求将委托给 get()
. 如果你需要处理 HEAD
请求的方式与 GET
,您可以重写 head()
方法。见 支持其他HTTP方法 举个例子。
如果该视图是使用它不支持的HTTP方法调用的,则改为调用该方法。
默认实现返回 HttpResponseNotAllowed
以纯文本形式列出允许的方法。
处理对选项HTTP谓词请求的响应。返回带有 Allow
包含视图允许的HTTP方法名称列表的头。
如果类上的其他HTTP方法处理程序是异步的 (async def
),则响应将被包装在协程函数中以用于 await
。
TemplateView
¶呈现给定模板,上下文包含在URL中捕获的参数。
Ancestors (MRO)
此视图从以下视图继承方法和属性:
方法流程图
示例视图.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
填充(通过 ContextMixin
)从为视图提供服务的URL模式捕获的关键字参数。
还可以使用 extra_context
的关键字参数 as_view()
.
RedirectView
¶重定向到给定的URL。
给定的URL可能包含字典样式的字符串格式,这些字符串格式将根据URL中捕获的参数进行插值。因为关键字插值是 总是 完成(即使没有参数传入),任何 "%"
URL中的字符必须写入为 "%%"
这样,Python就可以将它们转换为单一的登录输出。
如果给定的URL是 None
,Django将返回 HttpResponseGone
(410)。
Ancestors (MRO)
此视图从以下视图继承方法和属性:
方法流程图
示例视图.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。或 None
引发410(消失)HTTP错误。
要重定向到的URL模式的名称。反转将使用与此视图相同的args和kwargs来完成。
重定向是否应该是永久的。这里唯一的区别是返回的HTTP状态代码。如果 True
,则重定向将使用状态代码301。如果 False
,则重定向将使用状态代码302。默认情况下, permanent
是 False
.
是否将get查询字符串传递到新位置。如果 True
,然后将查询字符串附加到URL。如果 False
,则放弃查询字符串。默认情况下, query_string
是 False
.
Methods
构造用于重定向的目标URL。
这个 args
和 kwargs
参数是位置和/或关键字参数 captured from the URL pattern ,分别为。
默认实现使用 url
作为起始字符串并执行 %
该字符串中的命名参数使用URL中捕获的命名组。
如果 url
未设置, get_redirect_url()
尝试反转 pattern_name
使用在URL中捕获的内容(同时使用命名组和未命名组)。
如果要求 query_string
,它还会将查询字符串附加到生成的URL。只要方法返回一个可重定向的URL字符串,子类就可以实现他们想要的任何行为。
7月 22, 2024