在寫視圖的時候,Django除了使用函數做爲視圖,也可使用類做爲視圖。使用類視圖可使用類的一些特性,好比繼承等。html
django.views.generic.base.View是主要的類視圖,全部的類視圖都是繼承自他。若是咱們寫本身的類視圖,也能夠繼承自他。而後再根據當前請求的method,來實現不一樣的方法。好比這個視圖只能使用get的方式來請求,那麼就能夠在這個類中定義get(self,request,*args,**kwargs)方法。以此類推,若是隻須要實現post方法,那麼就只須要在類中實現post(self,request,*args,**kwargs)。示例代碼以下:django
from django.shortcuts import render from django.http import HttpResponse from django.views.generic import View # Create your views here. class addbook(View): def get(self, request, *args, **kwargs): return render(request, 'addbook.html') def post(self, request, *args, **kwargs): author = request.POST.get('author') print(author) return HttpResponse(author) def dispatch(self, request, *args, **kwargs): print("在get、post方法以前執行——若是你想在這以前作點事情……") return super(addbook, self).dispatch(request, *args, **kwargs)
類視圖寫完後,還應該在urls.py中進行映射,映射的時候就須要調用View的類方法as_view()來進行轉換。示例代碼以下:瀏覽器
urlpatterns = [ path('', views.bookList.as_view(), name='bookList'), ]
除了get方法,View還支持如下方法['get','post','put','patch','delete','head','options','trace']。函數
若是用戶訪問了View中沒有定義的方法。好比你的類視圖只支持get方法,而出現了post方法,那麼就會把這個請求轉發給http_method_not_allowed(request,*args,**kwargs)。示例代碼以下:post
from django.views.generic import View # Create your views here. class bookList(View): def get(self, request, *args, **kwargs): return HttpResponse('success') def http_method_not_allowed(self, request, *args, **kwargs): return HttpResponse('不支持GET之外的其它方式!')
# 若是不寫 http_method_not_allowed方法,會出現405狀態碼
urls.py
中的映射以下:url
urlpatterns = [ path('', views.bookList.as_view(), name='bookList'), ]
若是你在瀏覽器中訪問addbook/,由於瀏覽器訪問採用的是get方法,而addbook只支持post方法,所以以上視圖會返回您當前採用的method是:GET,本視圖只支持使用post請求!。
其實無論是get請求仍是post請求,都會走dispatch(request,*args,**kwargs)方法,因此若是實現這個方法,將可以對全部請求都處理到。spa