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')

 

posted @ 2018-04-27 16:00  FRESHMANS  阅读(223)  评论(0)    收藏  举报