基礎視圖

以下三個類別提供了建立 Django 視圖所需的大部分功能。您可以將它們視為視圖,它們可以單獨使用或繼承。它們可能無法提供專案所需的所有功能,在這種情況下,可以使用 Mixins 和泛型類別視圖。

Django 的許多內建類別視圖都繼承自其他類別視圖或各種 mixin。由於此繼承鏈非常重要,因此祖先類別的文件會放在標題為 祖先 (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

此視圖將接受的 HTTP 方法名稱清單。

預設

["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()

如果 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)

此視圖會繼承以下視圖的方法和屬性

方法流程圖

  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, 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。預設情況下,permanentFalse

query_string

是否將 GET 查詢字串傳遞到新的位置。如果 True,則查詢字串會附加到 URL。如果 False,則查詢字串會被捨棄。預設情況下,query_stringFalse

方法

get_redirect_url(*args, **kwargs)

建構重新導向的目標 URL。

argskwargs 引數分別是 從 URL 模式擷取的位置引數和/或關鍵字引數。

預設的實作方式是使用 url 作為起始字串,並使用 URL 中擷取的具名群組展開該字串中的 % 具名參數。

如果未設定 url,則 get_redirect_url() 會嘗試使用 URL 中擷取的內容(使用具名和不具名群組)反向解析 pattern_name

如果 query_string 要求,它也會將查詢字串附加到產生的 URL。子類別可以實作任何它們想要的行為,只要該方法返回一個可重新導向的 URL 字串即可。

返回頂部