Django fbv 和 cbv 简述
前面学习的例子都是通过 url 来匹配 一个函数,这种方式叫做 function based view (BSV)。一个典型的使用方式就是通过在view.py里面定义一个函数,然后通过函数的request参数获取method的类型,比如直接刷新页面就是get方式,提交表单就是post方式,这样来根据提交的不同方式进行不同的处理。
比如:
defuser_info(request):ifrequest.method=="GET":user_list=models.UserInfo.objects.all()group_list=models.UserGroup.objects.all()returnrender(request,'user_info.html',{'user_list':user_list,"group_list":group_list})elifrequest.method=='POST':u=request.POST.get('user')p=request.POST.get('pwd')models.UserInfo.objects.create(username=u,password=p)returnredirect('/cmdb/user_info/')
另外一种方式叫做 class based view (CBV)。这种方式需要导入一个View类,通过自定义一个子类继承这个类,我们可以利用View里面的dispatch()方法来判断请求是get还是post。dispatch方法的本质是一个反射器,可以根据名字来调用同名的方法。
View类的部分代码可以看出dispatch通过反射获取列表里面的方法名称
http_method_names=['get','post','put','patch','delete','head','options','trace']defdispatch(self,request,*args,**kwargs):#Trytodispatchtotherightmethod;ifamethoddoesn'texist,#defertotheerrorhandler.Alsodefertotheerrorhandlerifthe#requestmethodisn'tontheapprovedlist.ifrequest.method.lower()inself.http_method_names:handler=getattr(self,request.method.lower(),self.http_method_not_allowed)else:handler=self.http_method_not_allowedreturnhandler(request,*args,**kwargs)
CBV的例子如下。
注意这里在子类里面重新定义了dispatch这个方法,同时又使用了super()来调用父类的构造方法,这样的好处是功能不变,但是可以灵活的添加新的功能。
fromdjango.viewsimportViewclassHome(View):defdispatch(self,request,*args,**kwargs):#调用父类中的dispatchprint('before')result=super(Home,self).dispatch(request,*args,**kwargs)print('after')returnresultdefget(self,request):print(request.method)returnrender(request,'home.html')defpost(self,request):print(request.method,'POST')returnrender(request,'home.html')
为了调用自定义的类里面的方法,在url里面,我们需要调用View类的as_view()方法作为入口。
比如说
#urls.pyfromdjango.conf.urlsimporturlfrommyapp.viewsimportMyViewurlpatterns=[url(r'^about/',MyView.as_view()),]
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。