一. CBV与FBV

  CBV:Class Based View

  FBV:Function Based View

  我们之前写过的都是基于函数的view,就叫FBV。还可以把view写成基于类的,那就是CBV。

  下面我们就以前面所写的图书管理系统中的添加出版社为例:

  FBV版本:

# 新增出版社
def add_publisher(request):
if request.method == "POST":
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
return render(request, "add_publisher.html")

  CBV版本:

from django.views import View

class AddPublisher(View):
def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")

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

path('add_publisher/', views.AddPublisher.as_view()),  # 新增出版社  

二. 给视图加装饰器

  1. 使用装饰器装饰FBV

  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 # 新增出版社
@wrapper
def add_publisher(request):
if request.method == "POST":
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")
return render(request, "add_publisher.html")
  2. 使用装饰器装饰CBV

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

  方式一:给某个方法加上装饰器(此例给get方法加上)

from django.views import View
from django.utils.decorators import method_decorator class AddPublisher(View): # CBV版
@method_decorator(wrapper)
def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")

  方式二:加在dispatch方法上面,会给类下的所有方法加上此装饰器

class AddPublisher(View):  # CBV版
@method_decorator(wrapper)
def dispatch(self, request, *args, **kwargs):
obj = super(AddPublisher, self).dispatch(request, *args, **kwargs)
return obj def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")

  方式三:加在类上面

@method_decorator(wrapper, name="post")
@method_decorator(wrapper, name="get") # 给哪个方法加,就要指定name
class AddPublisher(View): # CBV版
def dispatch(self, request, *args, **kwargs):
obj = super(AddPublisher, self).dispatch(request, *args, **kwargs)
return obj def get(self, request):
return render(request, "add_publisher.html") def post(self, request):
pub_name = request.POST.get("name")
models.Publisher.objects.create(name=pub_name)
return redirect("/publisher_list/")

  

Django视图之FBV与CBV的更多相关文章

  1. django中的FBV和CBV

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

  2. django中的FBV和CBV??

    django中请求处理方式有2种:FBV 和 CBV 一.FBV FBV(function base views) 就是在视图里使用函数处理请求. 看代码: urls.py from django.c ...

  3. django基础之FBV与CBV,ajax序列化补充,Form表单

    目录: FBV与CBV ajax序列化补充 Form表单(一) 一.FBV与CBV 1.什么是FBV.CBV? django书写view时,支持两种格式写法,FBV(function bases vi ...

  4. Django 学习视图之FBV与CBV

    一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...

  5. Django中的FBV与CBV

    一. FBV FBV(function based views) 基于函数的视图, 即一个url对应一个视图函数. 1.1 FBV代码示例 urls.py from django.contrib im ...

  6. django中视图处理请求方式(FBV、CBV)

    FBV FBV(function base views) 就是在视图里使用函数处理请求. 在之前django的学习中,我们一直使用的是这种方式,所以不再赘述. CBV CBV(class base v ...

  7. django中视图函数的FBV和CBV

    1.什么是FBV和CBV FBV是指视图函数以普通函数的形式:CBV是指视图函数以类的方式. 2.普通FBV形式 def index(request): return HttpResponse('in ...

  8. django的FBV和CBV

    title: python djano CBV FBV tags: python, djano, CBV, FBV grammar_cjkRuby: true --- python django的fu ...

  9. python 视图 (FBV、CBV ) 、Request 和Response对象 、路由系统

    一.FBV和CBV1.基于函数的view,就叫FBV(Function Based View) 示例: def add_book(request): pub_obj=models.Publisher. ...

随机推荐

  1. BZOJ 1692: [Usaco2007 Dec]队列变换 (后缀数组/二分+Hash)

    跟BZOJ 4278: [ONTAK2015]Tasowanie一模一样 SA的做法就是把原串倒过来接在原串后面,O(nlogn)O(nlogn)O(nlogn)做后缀数组,就能O(1)O(1)O(1 ...

  2. hdu 6070 Dirt Ratio

    题 OvO http://acm.hdu.edu.cn/showproblem.php?pid=6070 (2017 Multi-University Training Contest - Team ...

  3. 浅析flex 布局

    Flex基本概念: 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis).主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end: ...

  4. fish-redux快速创建文件夹模板 FishReduxTemplate

    推荐一款插件: 在插件plugins中搜  FishReduxTemplate

  5. word粘贴图片到ekitor

    最近公司做项目需要实现一个功能,在网页富文本编辑器中实现粘贴Word图文的功能. 我们在网站中使用的Web编辑器比较多,都是根据用户需求来选择的.目前还没有固定哪一个编辑器 有时候用的是UEditor ...

  6. codevs 2010 求后序遍历x

    题目描述 Description 输入一棵二叉树的先序和中序遍历序列,输出其后序遍历序列. 输入描述 Input Description 共两行,第一行一个字符串,表示树的先序遍历,第二行一个字符串, ...

  7. Spring——5种增强方式

    一.前置增强 二.后置增强 三.环绕增强  环绕增强相当于前置增强和后置增强的结合体,可以使用<aop:around>进行处理,这里我采用代理工厂的方式 1.接口及其实现类 public ...

  8. 系统芯片 SoC

    SoC的定义多种多样,由于其内涵丰富.应用范围广,很难给出准确定义.一般说来, SoC称为系统级芯片,也有称片上系统,意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内 ...

  9. C++入门经典-例8.9-抽象类,纯虚函数,创建纯虚函数

    1:包含有纯虚函数的类称为抽象类,一个抽象类至少具有一个纯虚函数.抽象类只能作为基类派生出的新的子类,而不能在程序中被实例化(即不能说明抽象类的对象),但是可以使用指向抽象类的指针.在程序开发过程中并 ...

  10. 尚学堂requireJs课程---3、私有和公有属性和方法

    尚学堂requireJs课程---3.私有和公有属性和方法 一.总结 一句话总结: 在 [模块] 的基础上,在return对象里面的方法和属性就是公有的(因为外部可以访问),不在的就是私有的 < ...