码迷,mamicode.com
首页 > 其他好文 > 详细

Django-(CBV和FBV)

时间:2019-09-15 17:13:38      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:查看   event   ret   因此   code   spl   扩展   log   redirect   

FBV

# FBV版添加班级
def add_class(request):
    if request.method == "POST":
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")
    return render(request, "add_class.html")

CBV

# CBV版添加班级
from django.views import View


class AddClass(View):

    def get(self, request):
        return render(request, "add_class.html")

    def post(self, request):
        class_name = request.POST.get("class_name")
        models.Classes.objects.create(name=class_name)
        return redirect("/class_list/")

注意:

使用CBV时,urls.py中也做对应的修改:

# urls.py中
url(r^add_class/$, views.AddClass.as_view()),

CBV和FBV添加装饰器时候的区别

  1. 使用装饰器装饰FBV

    def wrapper(func):
        def inner(*args, **kwargs):
            start_time = time.time()
            ret = func(*args, **kwargs)
            end_time = time.time()
            print("used:", end_time-start_time)
            return ret
        return inner
    
    
    # FBV版添加班级
    @wrapper
    def add_class(request):
        if request.method == "POST":
            class_name = request.POST.get("class_name")
            models.Classes.objects.create(name=class_name)
            return redirect("/class_list/")
        return render(request, "add_class.html")

     

  2. 使用装饰器装饰CBV

    类中的方法与独立函数不完全相同,因此不能直接将函数装饰器应用于类中的方法 ,我们需要先将其转换为方法装饰器。

    Django中提供了method_decorator装饰器用于将函数装饰器转换为方法装饰器。

    # CBV版添加班级
    from django.views import View
    from django.utils.decorators import method_decorator
    
    class AddClass(View):
    
        @method_decorator(wrapper)
        def get(self, request):
            return render(request, "add_class.html")
    
        def post(self, request):
            class_name = request.POST.get("class_name")
            models.Classes.objects.create(name=class_name)
            return redirect("/class_list/")
    技术图片
    # 使用CBV时要注意,请求过来后会先执行dispatch()这个方法,如果需要批量对具体的请求处理方法,如get,post等做一些操作的时候,这里我们可以手动改写dispatch方法,这个dispatch方法就和在FBV上加装饰器的效果一样。(可以从as_view()进去查看源码)
    
    class Login(View):
         
        def dispatch(self, request, *args, **kwargs):
            print(before)
            obj = super(Login,self).dispatch(request, *args, **kwargs)
            print(after)
            return obj
     
        def get(self,request):
            return render(request,login.html)
     
        def post(self,request):
            print(request.POST.get(user))
            return HttpResponse(Login.post)
    关于CBV的扩展阅读

     

Django-(CBV和FBV)

标签:查看   event   ret   因此   code   spl   扩展   log   redirect   

原文地址:https://www.cnblogs.com/wtil/p/11523328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!