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 傳入。
Leave a Reply