CBV和FBV
剛開始寫的檢視都是基於函式版本的,稱為FBV,後來寫了一個NB的叫CBV,就是基於類的
FBV就是在URL中的一個路徑對應一個函式
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index) ]
在檢視中
def index(request): return render(request, 'index.html')
CBV 就是在 URL中對應一個類
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.IndexView.as_view()) # 執行類後面的as_view()方法,是父類裡面的方法 ]
在檢視中
from django.views import View class IndexView(View): # 以get形式訪問會執行get函式,一般情況下獲取資料 def get(self, *args, **kwargs): return HttpResponse('666') # 以post形式訪問的話會執行post函式,一般情況下傳送資料 def post(self, *args, **kwargs): return HttpResponse('999')
注意:
CBV在定義的時候,必須繼承View
在定義URL的時候,必須要加as_view
在類裡面使用form表單提交的話,只有get個post方法
在類中使用AJAX傳送資料的話,支援定義一下的很多種方法
restful規範
get:獲取資料
post:建立資料,提交資料
put更新
delete:刪除
patch:區域性重新整理
.....
給CBV新增裝飾器
如果有多個程式需要使用者登入驗證的話會造成程式碼冗餘,可以使用繼承很好的解決這個問題,但是還有更好的方法,那就是基於裝飾器實現登入驗證
類中的方法與獨立函式不完全相同,因此不能直接將函式裝飾器應用類中的方法,我們需要先將其轉化成方法裝飾器。
Django中提供了method_decorator裝飾器,用於將函式裝飾器轉換為方法裝飾器。
# CBV版新增班級 from django.views import View from django.utils.decorators import method_decorator class AddClass(View): @method_decorator(wrapper) def get(self, request): return render(request, "add_class.html") def post(self, request): class_name = request.POST.get("class_name") models.Classes.objects.create(name=class_name) return redirect("/class_list/")
# 使用CBV時要注意,請求過來後會先執行dispatch()這個方法,如果需要批量對具體的請求處理方法,如get,post等做一些操作的時候,這裡我們可以手動改寫dispatch方法,這個dispatch方法就和在FBV上加裝飾器的效果一樣。 class Login(View): def dispatch(self, request, *args, **kwargs): print('before') obj = super(Login,self).dispatch(request, *args, **kwargs) print('after') return obj def get(self,request): return render(request,'login.html') def post(self,request): print(request.POST.get('user')) return HttpResponse('Login.post')