Django的CBV方式講解
阿新 • • 發佈:2018-10-24
訪問 ews 繼承 water 查看源 tro class ges super
CBV使用配置
路徑url的配置
cbv 顧名知義就是通過類的方法來調用,我們在url中配置為如下路徑
url(r‘^cbv.html/‘, views.Cbv.as_view()),
這裏的Cbv是一個class 類,要想使用cbv方法,這個路徑後面還得必須有一個as_view()這個是必須的固定格式
views裏面函數的格式
在views裏面配置類,需要導入一個模塊
from django.views.generic import View #這個是導入的模塊,原來的django版本從django.views 裏面可以直接導入View,但是現在需要加一個generic才可以
class Cbv(View): #這裏必須要繼承View這個類,只有繼承了這個url那裏的as_view()才會有這個方法
def get(self,request):
return HttpResponse(‘cbv-get‘)
def post(self,request):
return HttpResponse(‘cbv-post‘)
瀏覽器get方式訪問
創建一個login登陸頁面測試post方法
views配置
from django.views.generic import View
class Cbv(View):
def get(self,request):
# return HttpResponse(‘cbv-get‘)
return render(request,‘login.html‘) #發送到login.html
def post(self,request):
return HttpResponse(‘cbv-post‘)
login的頁面配置代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>cbv學習</title>
</head>
<body>
<form action="/cbv.html/" method="post">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
</body>
</html>
瀏覽器訪問查看點擊提交後的結果
點擊提交
這裏通過查看View的源碼,可以看到裏面會有很多種提交方法
http_method_names = [‘get‘, ‘post‘, ‘put‘, ‘patch‘, ‘delete‘, ‘head‘, ‘options‘, ‘trace‘]
使用ajax的時候這些方法都是可以使用的。
另外繼承類不光有View,還有很多的,查看源碼就可以看到的
我的django版本號是
C:\Users\Tony>python3 -m django --version
1.9.13
cbv匹配原理
這種更具url來匹配方法的是通過反射方法(getattr)來做的。請求過來後先走dispatch這個方法,這個方法存在View類中。
def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn‘t exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn‘t on the approved list.
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)
定制dispatch
如果需要批量對方法,例如get,post等方法做一些操作的時候,這裏我們可以手動寫一個dispatch,這個dispatch就和裝飾器的效果一樣。因為請求來的時候總是先走的dispatch。
from django.views.generic import View
class Cbv(View):
def dispatch(self, request, *args, **kwargs):
print(‘操作前的操作‘)
obj = super(Cbv,self).dispatch(request, *args, **kwargs)
print(‘操作後的操作代碼‘)
return obj
def get(self,request):
# return HttpResponse(‘cbv-get‘)
return render(request,‘login.html‘)
def post(self,request):
return HttpResponse(‘cbv-post‘)
這次我們在通過瀏覽器訪問的時候,發現不管get或者post方法,都會走print代碼,
Django的CBV方式講解