Django 筆記 – 想在某個 Class-based View 呼叫另一個 Class-based View 來使用

as_view()

可以參考 Class-based views 的 as_view 文件

XXXView.as_view() 最常見到使用的地方,就是在 route 那邊,把某個 url pattern 指向某個 Class-based View

url(
   regex=r"xxx/(?P<test_id>\d+)",
   view=XXXView.as_view(),
   name="xxx"
)

.as_view() 會 return 一個 callable view, argument 是 HttpRequest,執行後,就會走入我們熟悉的 Class-based View 流程,包含(但不限於)按照 request 的 HTTP Method 去 call 到對應的 class Method … 等,詳情參考 as_view 文件,或者直接追蹤 as_view 相關原始碼。

所以,想在任何地方呼叫 Class-based View,可以像這樣

from OOXX import XXXView
... [略] ...

response = XXXView.as_view()(request)  # request 是 django.http.HttpRequest

另外如果你是在寫 Django REST Framework 的話,由於 APIView 的 request  可能是 rest_framwork.Request ,而不是 django.http.HttpRequest。

你需要找到 rest_framwork.Request 的 ._request 這個屬性,這個是原本的 django.http.HttpRequest,找到即可作為 argument 傳入。

You Might Also Like

Leave a Reply

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料