Django fbv 和 cbv 简述
admin
2023-07-29 07:40:13
0

前面学习的例子都是通过 url 来匹配 一个函数,这种方式叫做 function based view (BSV)。一个典型的使用方式就是通过在view.py里面定义一个函数,然后通过函数的request参数获取method的类型,比如直接刷新页面就是get方式,提交表单就是post方式,这样来根据提交的不同方式进行不同的处理。

比如:

def user_info(request):
    if request.method == "GET":
        user_list = models.UserInfo.objects.all()
        group_list = models.UserGroup.objects.all()
        return render(request, 'user_info.html', {'user_list': user_list, "group_list": group_list})
    elif request.method == 'POST':
        u = request.POST.get('user')
        p = request.POST.get('pwd')
        models.UserInfo.objects.create(username=u,password=p)
        return redirect('/cmdb/user_info/')

  

另外一种方式叫做 class based view (CBV)。这种方式需要导入一个View类,通过自定义一个子类继承这个类,我们可以利用View里面的dispatch()方法来判断请求是get还是post。dispatch方法的本质是一个反射器,可以根据名字来调用同名的方法。


View类的部分代码可以看出dispatch通过反射获取列表里面的方法名称

  http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
  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)


CBV的例子如下。


注意这里在子类里面重新定义了dispatch这个方法,同时又使用了super()来调用父类的构造方法,这样的好处是功能不变,但是可以灵活的添加新的功能。

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,'POST')
        return render(request, 'home.html')


为了调用自定义的类里面的方法,在url里面,我们需要调用View类的as_view()方法作为入口。

比如说

# urls.py
from django.conf.urls import url
from myapp.views 
import MyView
urlpatterns = [
    
    url(r'^about/', MyView.as_view()),
]


相关内容

热门资讯

山东日照马拉松报名系统突发故障... 近日,有网友发文称,山东日照马拉松报名系统泄露选手姓名、身份证号、电话等信息。7月2日,日照马拉松组...
三国前外长:以色列的所作所为已... 据凤凰卫视报道,随着美国与伊朗签署谅解备忘录,美以伊热战稍有平息,但是和平前景依然充满变数。第十四届...
穆杰塔巴以纸板人的方式出席哈梅... 伊朗前最高领袖哈梅内伊的遗体告别仪式7月3日在德黑兰举行,社交媒体上流传着一段他的儿子、伊朗新任最高...
装修步骤先后顺序(装修的顺序是... 摘要:顺序一、先需求后设计,平面布局是第一步,也是室内设计最关键的一步,它直接决定了你入住后的生活舒...
万和热水器锁定了怎么解锁 万和热水器锁定了怎么解锁1、可以长按升温间或降温间3到5秒。2、可以长按开机键3到5秒。3、可以参考...
万和燃气热水器锁住要怎么才可以... 万和燃气热水器锁住要怎么才可以解锁啊?需要将热水器关闭电源然后重新开启,再长按住升温键或者是降温键五...
万和热水器怎么解锁 万和热水器怎么解锁1、长按锁键3秒以上,一般为5秒表示可以打开。当热水器启动工作时不可以对温度再进行...
万和热水器如何解锁 万和热水器如何解锁出现锁定的时候先不要着急,可以找出说明书仔细的查看,一般来说都有方法,或者可以直接...
多名中国公民涉案被捕,中使馆提... 近期,越南警方开展打击电诈专项行动,捣毁多个电诈窝点,有多名我公民因涉案被捕。我馆亦处理多起领保案件...
王健林,再卖一座万达广场 万达商业推进资产处置工作,有了新进展。记者获悉,湛江开发区万达广场投资有限公司于近日完成工商股权变更...