天天看點

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',
]
           

小夥伴們如果需要使用,可以去檢視官方文檔或者檢視源碼進行了解