溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Django fbv 和 cbv 簡述

發(fā)布時間:2020-06-26 15:03:44 來源:網(wǎng)絡(luò) 閱讀:1799 作者:beanxyz 欄目:開發(fā)技術(shù)

前面學(xué)習(xí)的例子都是通過 url 來匹配 一個函數(shù),這種方式叫做 function based view (BSV)。一個典型的使用方式就是通過在view.py里面定義一個函數(shù),然后通過函數(shù)的request參數(shù)獲取method的類型,比如直接刷新頁面就是get方式,提交表單就是post方式,這樣來根據(jù)提交的不同方式進(jìn)行不同的處理。

比如:

def user_info(request):
    if request.method == "GET":
        user_list = models.UserInfo.objects.all()
        group_list = models.UserGroup.objects.all()
        return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
    elif request.method == 'POST':
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/cmdb/user_info/')

  

另外一種方式叫做 class based view (CBV)。這種方式需要導(dǎo)入一個View類,通過自定義一個子類繼承這個類,我們可以利用View里面的dispatch()方法來判斷請求是get還是post。dispatch方法的本質(zhì)是一個反射器,可以根據(jù)名字來調(diào)用同名的方法。


View類的部分代碼可以看出dispatch通過反射獲取列表里面的方法名稱

  http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  def dispatch(self, request, *args, **kwargs):
        # Try to dispatch to the right method; if a method doesn't exist,
        # defer to the error handler. Also defer to the error handler if the
        # request method isn't on the approved list.
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed
        return handler(request, *args, **kwargs)


CBV的例子如下。


注意這里在子類里面重新定義了dispatch這個方法,同時又使用了super()來調(diào)用父類的構(gòu)造方法,這樣的好處是功能不變,但是可以靈活的添加新的功能。

from django.views import View
class Home(View):
    def dispatch(self, request, *args, **kwargs):
        # 調(diào)用父類中的dispatch
        print('before')
        result = super(Home,self).dispatch(request, *args, **kwargs)
        print('after')
        return result
        
    def get(self,request):
        print(request.method)
        return render(request, 'home.html')
        
    def post(self,request):
        print(request.method,'POST')
        return render(request, 'home.html')


為了調(diào)用自定義的類里面的方法,在url里面,我們需要調(diào)用View類的as_view()方法作為入口。

比如說

# urls.py
from django.conf.urls import url
from myapp.views 
import MyView
urlpatterns = [
    
    url(r'^about/', MyView.as_view()),
]


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI