day18-django FBV/CBV

一、引子  

  之前我们讲了 一个路由的指向view.py中的一个函数,今天我们来研究通过路由如何指向一个类,这个设计到django的CBV和FBV的概念,今天我们就来好好说说这个两个产物到底是啥?

  • FBV   => function base view  基于函数视图  =>  /index/ -->指向函数
  • CBV  => class base view  基于类视图  =>   /index/--> 指向类

二、FBV

  之前我们学习使用的都是这种方式, 居于函数视图,FBV, function base view

  

  

三、CBV

  3.1、语法

    说明:CBV这种是指的是类视图,即:/index/--> 指向类

1
2
3
4
5
6
7
8
9
10
11
12
url.py
       index -> view.类名.as_view()  #这个是固定用法
 
view.py
       from django.views import View  #导入View模块,并且继承这个类
       class  类名(View):
             
            def get(self,request):  #接收客户端是get请求的,则执行是get方法
                   ....
 
            def post(self,request): #接收客户端是post请求的,则执行是post方法
                   ....

   3.2、举个栗子,对比一下

     home.html 

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6 </head>
 7 <body>
 8     <h3>CBV 请求方式 &nbsp;{{ method1 }}</h3>
 9 
10 
11     <form action="/home/" method="POST">
12         <h3>CBV form 请求方式 {{ method }}</h3>
13 
14         <input type="text">
15         <p></p>
16         <input type="submit" value="提交">
17     </form>
18 </body>
19 </html>

    url 

  

    views 代码

 1 from django.views import View  #1,先导入 父类
 2 
 3 class Home(View):
 4 
 5     def post(self,request):  #2,定义方法  ,还有很多其他方法
 6         M=request.method
 7         return render(request,"home.html",{'method':M})
 8 
 9 
10     def get(self,request):
11         M1=request.method
12         return render(request,"home.html",{'method1':M1})

  结果:当第一次请求时,get 方式,页面中显示 如下

    

  第二次请求:点击提交, 结果如下

    

四、CBV原理说明

  CBV 中  Home 类是怎么判读,请求方式的呢? 还有其他什么方法,

  查看 view 源码

  得到 答案:请求方式 种类

  ttp_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']

    

 

   根据说明来判断方法

    根据类的反射  ,先执行dispatch 方法,获取请求方式,再执行类中具体方法

  

 

   知道真相的我们,就希望搞点小动作

  我们可以自己定义  dispatch 方法,继承父类中的 dispatch 方法,在请求之前,之后搞些小动作。

  貌似很厉害的样子,只是不知道具体用户,先搞个小栗子把。

  

 

posted @ 2018-07-13 12:01  东郭仔  阅读(158)  评论(0)    收藏  举报