5.1類視圖
5.1.1類視圖介紹
以函數的方式定義的視圖稱爲函數視圖。在Django中也可以使用類來定義一個視圖,稱爲類視圖。使用類視圖可以將視圖對應的不同請求方式以類中的不同方法來區別定義。如:
from django.views.generic import View
class RegisterView(View):
"""類視圖:處理註冊"""
def get(self, request):
"""處理GET請求,返回註冊頁面"""
return render(request, 'register.html')
def post(self, request):
"""處理POST請求,實現註冊邏輯"""
return HttpResponse('這裏實現註冊邏輯')
類視圖的好處:
- 代碼可讀性好
- 類視圖相對於函數視圖有更高的複用性
5.1.2類視圖的使用
定義類視圖需要繼承自Django提供的父類View,可使用from django.views.generic import View或者from django.views.generic.base import View 導入。
配置路由時,使用類視圖的as_view()方法來添加:
urlpatterns = [
# 類視圖綁定路由 url(r'^register/$', views.RegisterView.as_view()), ]
5.1.3類視圖使用裝飾器
(1)在url配置中裝飾
urlpatterns = [
# url(r'^define_classview/$', views.裝飾器名(views.類視圖名.as_view())) url(r'^define_classview/$', views.my_decorator(views.DefineClassview.as_view())) ]
此種方式會爲類視圖中的所有請求方法都加上裝飾器行爲
(2)在類視圖中裝飾
在類視圖中使用爲函數視圖準備的裝飾器時,不能直接添加裝飾器,需要使用method_decorator將其轉換爲適用於類視圖方法的裝飾器。
method_decorator裝飾器使用name參數指明被裝飾的方法
# 爲全部請求方法添加裝飾器
@method_decorator(my_decorator, name='dispatch')
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
# 爲特定請求方法添加裝飾器
@method_decorator(my_decorator, name='get')
class DemoView(View):
def get(self, request):
print('get方法')
return HttpResponse('ok')
def post(self, request):
print('post方法')
return HttpResponse('ok')
如果需要爲類視圖的多個方法添加裝飾器,但又不是所有的方法,可以直接在需要添加裝飾器的方法上使用method_decorator
from django.utils.decorators import method_decorator
# 爲特定請求方法添加裝飾器
class DemoView(View):
@method_decorator(my_decorator) # 爲get方法添加了裝飾器
def get(self, request):
print('get方法')
return HttpResponse('ok')
@method_decorator(my_decorator) # 爲post方法添加了裝飾器
def post(self, request):
print('post方法')
return HttpResponse('ok')
def put(self, request): # 沒有爲put方法添加裝飾器
print('put方法')
return HttpResponse('ok')
5.1.4類視圖Mixin擴展類
使用面向對象多繼承的特性,可以通過定義父類(作爲擴展類),在父類中定義想要向類視圖補充的方法,類視圖繼承這些擴展父類,便可實現代碼複用。
定義的擴展父類名稱通常以Mixin結尾。注意:在繼承多個父類時,需要將View放在最後。