CBV模式即爲API式的寫法,一個資源類接受一系列的請求。本文討論的是View的直接子類中的概念和方法,Django REST framework中重寫和添加了大量的方法,能夠直接繼承自XXXAPIView,再也不本文的討論範圍。python
class HelloView(View):
def get(self, request):
return HttpResponse("GET view ok")
複製代碼
View中的方法git
def get(self, request):
return HttpResponse("GET %s" % self.msg)
複製代碼
def as_view(resquest):
def view(cls)
self = cls(**initkwargs)
複製代碼
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
複製代碼
return [m.upper() for m in self.http_method_names if hasattr(self, m)]
複製代碼
as_viewgithub
經過內置方法dispatch來分發請求方法函數
重寫View父類,實現繼承自重寫類的類,能夠支持請求方法post
class HelloCustomView(object):
@classmethod
def as_view(cls):
def view(request):
self = cls()
return self.dispatch(request)
return view
def dispatch(self, request):
handler = getattr(self, request.method.lower(), None)
if not handler:
return HttpResponse("request method not allowed")
return handler(request)
def get(self, request):
return HttpResponse("GET")
def post(self, request):
return HttpResponse("POST")
def put(self, resquest):
return HttpResponse("PUT")
複製代碼
繼承關係如圖url
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gSkf4aVq-1573007279134)(github.com/belingud/im…)]spa
有三個父類code
TemplateView實現的功能:對象
繼承關係如圖blog
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BIF0IjzQ-1573007279135)(github.com/belingud/im…)]
ListView只是繼承父類,沒有在其中增改方法
有兩個父類:
MultipleObjectTemplateResponseMixin的屬性和方法
屬性:
方法:
BaseListView的屬性和方法
無屬性
方法:
return self.render_to_response(context)
複製代碼
有一個父類
也是View的父類,屬性和方法同上文的TemplateResponseMixin
有兩個父類
他有一個父類ContextMixin,父類的類方法 get_context_data
將傳入的鍵值對轉化爲’view’鍵字典的默認多繼承父類
屬性:
傳入一個model或者query_set,返回modelname_list,不然默認爲object_list
model = Book # 或下面的query_set
queryset = Book.objects.all()
複製代碼
方法:
即上文中的View
graph LR
A[url] --> B[as_views]
B[as_views]-->C[dis_patch]
C[dis_patch]-->D[get]
D[get]-->E[get_queryset]
E[get_queryset]-->F[get_context_data]
F[get_context_data]-->G[render_to_response]
複製代碼
graph TD
A[get_queryset]-->B[queryset屬性和model屬性]
A[get_queryset]-->C[get_ordering]
A[get_queryset]-->D[get_allow_empty]
複製代碼
graph TD
A[get_context_data]-->B[get_paginate_by]
A[get_context_data]-->C[get_context_object_name]
A[get_context_data]-->D[向context中注入數據]
複製代碼