基礎視圖¶
以下三個類別提供了建立 Django 視圖所需的大部分功能。您可以將它們視為父視圖,它們可以單獨使用或繼承。它們可能無法提供專案所需的所有功能,在這種情況下,可以使用 Mixins 和泛型類別視圖。
Django 的許多內建類別視圖都繼承自其他類別視圖或各種 mixin。由於此繼承鏈非常重要,因此祖先類別的文件會放在標題為 祖先 (MRO) 的章節下。MRO 是方法解析順序 (Method Resolution Order) 的縮寫。
View
¶
- class django.views.generic.base.View¶
基礎視圖類別。所有其他基於類別的視圖都繼承自這個基礎類別。它嚴格來說不是泛型視圖,因此也可以從
django.views
導入。方法流程圖
範例 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¶
此視圖將接受的 HTTP 方法名稱清單。
預設
["get", "post", "put", "patch", "delete", "head", "options", "trace"]
方法
- classmethod as_view(**initkwargs)¶
傳回一個可呼叫的視圖,該視圖會接收一個請求並傳回一個回應
response = MyView.as_view()(request)
傳回的視圖具有
view_class
和view_initkwargs
屬性。當視圖在請求/回應週期中被呼叫時,
setup()
方法會將HttpRequest
指派給視圖的request
屬性,以及任何位置和/或關鍵字引數 從 URL 模式擷取 分別指派給args
和kwargs
屬性。然後會呼叫dispatch()
。如果
View
子類別定義了非同步 (async def
) 方法處理常式,as_view()
會將傳回的可呼叫物件標記為協程函式。如果在單個視圖類別中同時定義了非同步 (async def
) 和同步 (def
) 處理常式,則會引發ImproperlyConfigured
例外狀況。
- setup(request, *args, **kwargs)¶
在
dispatch()
之前執行主要的視圖初始化。如果覆寫此方法,您必須呼叫
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 方法名稱清單。如果類別中的其他 HTTP 方法處理常式是非同步 (
async def
),則回應會包裝在協程函式中,以便與await
一起使用。
TemplateView
¶
- class django.views.generic.base.TemplateView¶
使用包含在 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().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)
此視圖會繼承以下視圖的方法和屬性
方法流程圖
範例 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, 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://djangoproject.dev.org.tw/"), name="go-to-django", ), ]
屬性
- url¶
要重新導向到的 URL (以字串表示)。或者
None
以引發 410 (Gone) HTTP 錯誤。
- pattern_name¶
要重新導向到的 URL 模式的名稱。反轉將使用與此視圖傳入的相同的 args 和 kwargs 來完成。
- permanent¶
重新導向是否應該是永久的。這裡唯一的差異是傳回的 HTTP 狀態碼。如果
True
,則重新導向將使用狀態碼 301。如果False
,則重新導向將使用狀態碼 302。預設情況下,permanent
為False
。
- query_string¶
是否將 GET 查詢字串傳遞到新的位置。如果
True
,則查詢字串會附加到 URL。如果False
,則查詢字串會被捨棄。預設情況下,query_string
為False
。
方法
- get_redirect_url(*args, **kwargs)¶
建構重新導向的目標 URL。
args
和kwargs
引數分別是 從 URL 模式擷取的位置引數和/或關鍵字引數。預設的實作方式是使用
url
作為起始字串,並使用 URL 中擷取的具名群組展開該字串中的%
具名參數。如果未設定
url
,則get_redirect_url()
會嘗試使用 URL 中擷取的內容(使用具名和不具名群組)反向解析pattern_name
。如果
query_string
要求,它也會將查詢字串附加到產生的 URL。子類別可以實作任何它們想要的行為,只要該方法返回一個可重新導向的 URL 字串即可。