Django的CBV和FBV

Posted momo8238

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django的CBV和FBV相关的知识,希望对你有一定的参考价值。

1. Django支持两种对应关系,CBV和FBV

FBV:function base view &CBV:class base view
  url.py
   index---函数名
  views.py
   def 函数(request):
  

/index/ -> 函数名
 /index/ ->类,请求来了以后,会执行类里面的指定的方法。

 

2.CBV提交----- class Home(view) Home类必须继承view.

2.1 urls.py中写对应关系

 

2.2 views.py中写函数. get来了,执行get方法, post来了,执行 post方法。

 

2.3 home.html中写模板

 3. 过程

服务器端先运行起来; 客户端发来请求,先去匹配URL,找到类。再进行二次匹配,匹配请求的方法(get/put)。

是基于反射(getattr, hasattr, deleteattr)来进行匹配的,进而知道应该执行哪个类。

 

父类的dispatch 是先执行的,后面的get/post 都是通过dispatch反射进而找到的。

找到执行完以后,也是把结果先返回给dispatch,然后再返回给客户端。

 

4. 自己可以修改父类的dispatch方法,进而增加一些新的功能。

运行以后,后台结果如下:

 

5.本节笔记

FBV:function base view &CBV:class base view
		url.py 
			index---函数名
		views.py 
			def 函数(request):
		/index/ -> 函数名
		/index/ ->类,请求来了以后,会执行类里面的指定的方法。
			
		建议:两者都用

 6.至此

urls.py程序:

from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r\'^admin/\', admin.site.urls),
    url(r\'^index/\', views.index),
    url(r\'^login/\', views.login),
    url(r\'^home/\', views.Home.as_view()),
]

 views.py程序

from django.shortcuts import render,HttpResponse,redirect

# Create your views here.
def index(request):
    return HttpResponse(\'index\')
def login(request):
    if request.method==\'GET\':
        return render(request,\'login.html\')
    elif request.method==\'POST\':
        #radio
        #v1=request.POST.get(\'gender\')
        #print(v1)
        #checkbox
        #v2=request.POST.getlist(\'favor\')
        #print(v2)
        #v3=request.POST.get(\'fafafa\')
       #print(v3)
        obj=request.FILES.get(\'fafafa\')
        print(obj,type(obj),obj.name)
        import os
        file_path=os.path.join(\'upload\',obj.name)
        f=open(file_path, mode="wb")
        for i in obj.chunks():
            f.write(i)
        f.close()

        return render(request,\'login.html\')
    else:
        # put,delete,head,option.....
        return redirect(\'/index/\')


from django.views import View
class Home(View):
    def dispatch(self,request,*args,**kwargs):
        #调用父类中的dispatch
        print(\'before\')
        result=super(Home,self).dispatch(request,*args,**kwargs)
        print(\'after\')
        return result

    def get(self,request):
        print(request.method)
        return render(request,\'home.html\')
    def post(self,request):
        print(request.method)
        return render(request,\'home.html\')


"""def login(request):
    if request.method==\'GET\':
        return render(request,\'login.html\')
    elif request.method==\'POST\':
        u = request.POST.get(\'user\')
        p = request.POST.get(\'pwd\')
        if u==\'root\' and p==\'123\':
            return redirect(\'/index/\')
        else:
            return render(request,\'login.html\')
    else:
        # put,delete,head,option.....
        return redirect(\'/index/\')
"""

 

home.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>

 

以上是关于Django的CBV和FBV的主要内容,如果未能解决你的问题,请参考以下文章

django中的FBV和CBV

Django之FBV和CBV模式

django中的FBV和CBV

191112Django fbv和cbv

django 的cbv和fbv

django补充CBV和FBV模式