本文共 2265 字,大约阅读时间需要 7 分钟。
cbv 顾名知义就是通过类的方法来调用,我们在url中配置为如下路径
url(r'^cbv.html/', views.Cbv.as_view()),
这里的Cbv是一个class 类,要想使用cbv方法,这个路径后面还得必须有一个as_view()这个是必须的固定格式
在views里面配置类,需要导入一个模块
from django.views.generic import View #这个是导入的模块,原来的django版本从django.views 里面可以直接导入View,但是现在需要加一个generic才可以class Cbv(View): #这里必须要继承View这个类,只有继承了这个url那里的as_view()才会有这个方法 def get(self,request): return HttpResponse('cbv-get') def post(self,request): return HttpResponse('cbv-post')
from django.views.generic import Viewclass Cbv(View): def get(self,request): # return HttpResponse('cbv-get') return render(request,'login.html') #发送到login.html def post(self,request): return HttpResponse('cbv-post')
login的页面配置代码
cbv学习
点击提交
这里通过查看View的源码,可以看到里面会有很多种提交方法
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
使用ajax的时候这些方法都是可以使用的。
另外继承类不光有View,还有很多的,查看源码就可以看到的
我的django版本号是
C:\Users\Tony>python3 -m django --version1.9.13
这种更具url来匹配方法的是通过反射方法(getattr)来做的。请求过来后先走dispatch这个方法,这个方法存在View类中。
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)
如果需要批量对方法,例如get,post等方法做一些操作的时候,这里我们可以手动写一个dispatch,这个dispatch就和装饰器的效果一样。因为请求来的时候总是先走的dispatch。
from django.views.generic import Viewclass Cbv(View): def dispatch(self, request, *args, **kwargs): print('操作前的操作') obj = super(Cbv,self).dispatch(request, *args, **kwargs) print('操作后的操作代码') return obj def get(self,request): # return HttpResponse('cbv-get') return render(request,'login.html') def post(self,request): return HttpResponse('cbv-post')
这次我们在通过浏览器访问的时候,发现不管get或者post方法,都会走print代码,
转载于:https://blog.51cto.com/sgk2011/2061658