django基础(四)之两种对应关系
两种对应关系
/login =====> function() 对应函数 fbv
/login =====> class() 对应类 cbv
之前用的都是fbv,这里写一下cbv的用法
示例
##urls.py
from django.conf.urls import url
from django.contrib import admin
from cmdb import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
#url(r'^login/', views.Home.as_view()),
#url(r'^home',views.home)
url(r'^home/',views.Home.as_view()), ##对应类时的写法,这里的Home为视图函数下的Home类,as_view()为固定写法
#views.py
from django.views import View
class Home(View):
##此处为在执行get和post函数之前要做的事(自定义的功能),程序执行时,会通过View下的dispatch函数来判断请求是get方法还是post方法
#然后去执行相应的函数,此处相当于在判断请求方法之前自定义功能(无论是get还是post请求,此处都会执行)
def dispatch(self, request, *args, **kwargs):
print('before')
###下面为调用父类的dispatch方法
result = super(Home,self).dispatch(request,*args, **kwargs)
print('after')
return result
def get(self,request):
print(request.method)
return render(request,'test.html')
def post(self,request):
print (request.method,'post')
return render(request,'test.html')
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/home/" method="POST"> <input type="text" name='user' /> <input type="submit"> </form> </body> </html>
结果:

多个类共用一个dispatch
from django.views import View
#自定义的dispatch方法,程序会默认会先调用这个distach方法,然后会判断去调用get还是post方法,详细看源码
class myview(object):
def dispatch(self, request, *args, **kwargs):
print('before')
result = super(myview,self).dispatch(request,*args, **kwargs) #这里的super初始化的为View方法里的dispatch(默认继承的View)里的参数
print('after')
return result
class Home(myview,View): #要先继承myview这个视图,如果View在前面的话,自定义的dispatch方法就会不执行
def get(self,request):
print(request.method)
return render(request,'test.html')
def post(self,request):
print (request.method,'post')
return render(request,'test.html')
class Home2(myview,View):
def get(self,request):
print(request.method)
return render(request,'test2.html')
def post(self,request):
print (request.method,'post')
return render(request,'test2.html')

浙公网安备 33010602011771号