Django(27)類視圖
類視圖
在寫視圖的時候,Django
除了使用函數作為視圖,也可以使用類作為視圖。使用類視圖可以使用類的一些特性,比如繼承等。
View
django.views.generic.base.View
是主要的類視圖,所有的類視圖都是繼承自他。如果我們寫自己的類視圖,也可以繼承自他。然後再根據當前請求的method
,來實現不同的方法。比如這個視圖只能使用get
的方式來請求,那麼就可以在這個類中定義get(self,request,*args,**kwargs)
方法。以此類推,如果只需要實現post
方法,那麼就只需要在類中實現post(self,request,*args,**kwargs)
。示例程式碼如下:
from django.views import View
class BookDetailView(View):
def get(self,request,*args,**kwargs):
return render(request,'detail.html')
類視圖寫完後,還應該在urls.py
中進行映射,映射的時候就需要調用View
的類方法as_view()
來進行轉換。示例程式碼如下:
urlpatterns = [
path("detail/<book_id>/",views.BookDetailView.as_view(),name='detail')
]
除了get
方法,View
還支援以下方法['get','post','put','patch','delete','head','options','trace']
。
如果用戶訪問了View
中沒有定義的方法。比如你的類視圖只支援get
方法,而出現了post
方法,那麼就會把這個請求轉發給http_method_not_allowed(request,*args,**kwargs)
。示例程式碼如下:
class AddBookView(View):
def post(self,request,*args,**kwargs):
return HttpResponse("書籍添加成功!")
def http_method_not_allowed(self, request, *args, **kwargs):
return HttpResponse("您當前採用的method是:%s,本視圖只支援使用post請求!" % request.method)
urls.py
中的映射如下:
path("addbook/",views.AddBookView.as_view(),name='add_book')
如果你在瀏覽器中訪問addbook/
,因為瀏覽器訪問採用的是get
方法,而addbook
只支援post
方法,因此以上視圖會返回您當前採用的method
是:GET,本視圖只支援使用post請求!。
其實不管是get
請求還是post
請求,都會走dispatch(request,*args,**kwargs)
方法,所以如果實現這個方法,將能夠對所有請求都處理到。
Django還為我們提供了很多內置的視圖類,如下
__all__ = [
'View', 'TemplateView', 'RedirectView', 'ArchiveIndexView',
'YearArchiveView', 'MonthArchiveView', 'WeekArchiveView', 'DayArchiveView',
'TodayArchiveView', 'DateDetailView', 'DetailView', 'FormView',
'CreateView', 'UpdateView', 'DeleteView', 'ListView', 'GenericViewError',
]
小夥伴們如果需要使用,可以去查看官方文檔或者查看源碼進行了解