一. 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. 网络摘抄-深入浅出JVM调优

    基本概念: JVM把内存区分为堆区(heap).栈区(stack)和方法区(method).由于本文主要讲解JVM调优,因此我们可以简单的理解为,JVM中的堆区中存放的是实际的对象,是需要被GC的.其 ...

  2. SQL中where in的用法

    首先我们要知道where是什么:一个判断符.在SQL操作中,控制只选择指定的行. in的其实归类于特殊的比较运算符 expr1 between expr2 and expr3:表示expr1的值在ex ...

  3. luogu 1414 又是毕业季II 约数相关

    感觉好水呀~ Code: #include <cstdio> #include <algorithm> #define N 1000005 #define setIO(s) f ...

  4. JavaScript如何比较两个数组的内容是否相同

    今天意外地发现JavaScript是不能用==或===操作符直接比较两个数组是否相等的. alert([]==[]); // false alert([]===[]); // false 以上两句代码 ...

  5. Java线程之wait()、notify()、notifyAll()

    翻译:https://www.journaldev.com/1037/java-thread-wait-notify-and-notifyall-example 简述 java中Objct对象包含三个 ...

  6. javaScript用正则来获取url传递的参数

    用window.location.href获取url再js正则来获得需要的参数: 这个正则有多种写法,这里我选择这样写,要查找的属性名我直接以参数的形式传进去,用正则查找,以"?&# ...

  7. C++入门经典-例7.6-this指针,同一个类的不同对象数据

    1:对于类的非静态成员,每个对象都有自己的一份拷贝,即每个对象都有自己的数据成员,不过成员函数却是每个对象共享的.那么调用共享的成员函数如何找到自己的数据成员呢?答案是通过类中隐藏的this指针. 2 ...

  8. LeetCode 144. 二叉树的前序遍历(Binary Tree Preorder Traversal)

    题目描述 给定一个二叉树,返回它的 前序 遍历. 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 解题思路 由 ...

  9. python:将numpy数组写入csv文件

    import numpy as np np.savetxt('E:\\forpython\\featvector.csv',data_to_save,delimiter=',')

  10. 9.关联规则那不行fizi麸子

    1.关联规则概述 2.关联规则算法罗兵烙饼选择 3.关联规则的算法