Django Function Based View(FBV)和Class Based View (CBV)对比
一、FBV处理过程
首先来看一下FBV逻辑过程:
1.简单过程(借用官方示例):
- urls:
- from django.conf.urls import url
- from . import views
- urlpatterns = [
- url(r'^$', views.index, name='index'),
- ]
- views:
- from django.http import HttpResponse
- from .models import Question
- def index(request):
- latest_question_list = Question.objects.order_by('-pub_date')[:5]
- output = ', '.join([q.question_text for q in latest_question_list])
- return HttpResponse(output)
step1:根据访问请求,在urls寻找匹配的url映射,得到views.index
setp2:根据views.index ,调用views下index函数(传入参数request即用户请求信息)
step3:根据客户请求信息对数据进行处理,得到用户所需的数据output和context,通过HttpResponse返回将客户端
2.对1中每步进行扩充
step1中可以引入参数,传递给views中函数处理
- ......
- urls:
- url(r'^(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
- ......
- views:
- def detail(request, question_id):
- return HttpResponse("You're looking at question %s." % question_id)
进一步扩展,逆向解析如reverse等。
step2中扩展,如根据用户对数据库进行增删改查操作,得到querysets,或获取其他context上下文信息
step3扩展,可以将结果传递给模板渲染后返回给客户端:
如将内容内容context用模板template渲染,传递给request对应的response。即render(request, template_name, context, content_type, status, using)
- from django.shortcuts import render
- def my_view(request):
- # View code here...
- return render(request, 'myapp/index.html', {"foo": "bar"},
- content_type="application/xhtml+xml")
- # 等同于以下
- from django.http import HttpResponse
- from django.template import RequestContext, loader
- def my_view(request):
- # View code here...
- t = loader.get_template('myapp/index.html')
- c = RequestContext(request, {'foo': 'bar'})
- return HttpResponse(t.render(c),
- content_type="application/xhtml+xml")
FBV过程基本就是这样
二 CBV的过程浅析
其实CBV过程可以看成是FBV过程的抽象化、对象化。他需要最基本的三个类View,ContextMixin,TemplateResponseMixin
对应FBV的三个步骤:
step1. View类提供类方法as_view(),用于调用dipatch(),根据request类型分发给get,post...等对应方法处理。
step2. ContextMixin类,get_context_data(self, **kwargs)获取上下文数据,如果对数据库进行操作均可以继承该类,然后将增删改查的结果放入上下文数据中(即重写get_context_data)
step3. TemplateResponseMixin类,将内容渲染到指定模板上,通过render_to_response()方法实现对应功能
而其他模板视图基本就是在这三个类上进行继承重写后得到。
1. 通用模板视图
TemplateView (TemplateResponseMixin, ContextMixin, View)
2. 单个对象模板视图 DetailView (SingleObjectTemplateResponseMixin,BaseDetailView)
其中关键的一个类就是 SingleObjectMinxin,即从数据库中获取用户请求的单条数据。
3. 多个对象模板视图 ListView (MultipleObjectTemplateResponseMixin, BaseListView)
其中关键的一个类就是 MultipleObjectMixin,从数据库中获取用户请求的数据列表。
4. 数据新增视图 CreateView (SingleObjectTemplateResponseMixin, BaseCreateView)
由于新增数据通常由客户端通过form提交,故设计到form表单的相关内容,如表单数据的有效性,表单提交成功的url等。均有FormMinxin基础类产生。
5. 数据更新模板 UpdateView (SingleObjectTemplateResponseMixin, BaseUpdateView)
用于更新数据,与CreateView类似
6. 数据删除视图 DeleteView (SingleObjectTemplateResponseMixin, BaseDeleteView)
其中关键的类是 DeletionMixin ,删除对应数据。
而有关Archive视图将后续文章中分析, 基本也和编辑展示的视图一样。
类中的属性和方法可参见官方文档说明。这样就可以写出自己需要的类了。
Django Function Based View(FBV)和Class Based View (CBV)对比的更多相关文章
- Django 学习视图之FBV与CBV
一. CBV与FBV CBV:Class Based View FBV:Function Based View 我们之前写过的都是基于函数的view,就叫FBV.还可以把view写成基于类的,那就是C ...
- Django - 自定义分页、FBV和CBV
一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...
- Django生命周期,FBV,CBV
一. Django生命周期 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串,在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中.Django的请求生命周 ...
- Android中View绘制优化之三---- 优化View
本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译三: 优化视图 关于如何设计自定义View以及响应触摸时间等,请看Android developer : 地 ...
- 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析
内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...
- View学习(四)-View的绘制(draw)过程
View的draw过程相比之于measrue过程,也是比较简单的.并且在我们自定义View时,也经常需要重写onDraw方法,来绘制出我们要实现的效果. 如之前的文章所说,绘制的流程也是起始于View ...
- View (五)自定义View的实现方法
一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了. 如果说要按类型来划分的话,自定义Vi ...
- 在Android中将子View的坐标转换为父View的坐标
在Android中,我们有时候可能会将子View的坐标转换为父View中的坐标.感觉很有用,分享给大家. 在Launcher中有这么一段代码可以完成这项工作. public float getDes ...
- 【转】Android绘制View的过程研究——计算View的大小
Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...
随机推荐
- 使用sqlldr向Oracle导入大的文本(txt)文件
我们有多种方法可以向Oracle数据库里导入文本文件,但如果导入的文本文件过大,例如5G,10G的文本文件,有些方法就不尽如意了,例如PLSQL Developer中的导入文本功能,如果文本文件过大, ...
- 日志分析工具-ApexSQL介绍
原文:日志分析工具-ApexSQL介绍 使用场景:业务数据异常变化,通过代码分析不出来的时候,迫不得已需要通过日志来分析 下载地址:http://www.apexsql.com/Download.as ...
- C#实现RSA加密和解密详解
原文:C#实现RSA加密和解密详解 RSA加密解密源码: Code highlighting produced by Actipro CodeHighlighter (freeware) http:/ ...
- asp.net mvc放在iis7.5中提示404错误 js异步请求失效解决办法
asp.net mvc中js发请求一般写成: $.get("/Can/index"本地上是没有问题的但是部署到iis上,提示404,正确的请求的路径是:/网站名/Can/index ...
- MVC5入门学习系列④
添加Model且简单的使用EF 对于EF(EntityFramework)不了解的朋友可以去百度文科或者在园子里搜一些简资源看下,假如和我一样知道EF的概念,那么就知道EF有一个code first的 ...
- Javascript多线程引擎(七)
Javascript多线程引擎(七)--synchronized关键字 经过两天的努力, 今天synchronzied关键字终于支持了, 如下是测试代码 thread() 是一个开启新线程的API, ...
- 什么是gulp
gulp:入门简介 本文是gulp的入门级介绍,主要内容包括什么是gulp,gulp与grunt有什么区别,gulp可以解决grunt存在的哪些问题,以及一个简单的说明例子. 什么是gulp gu ...
- MFC双缓冲和裁剪问题导致闪烁
问题描述: 应用场景:在对话框中,自定义一个MFC图形控件(为了描述方便,暂定为HSPaintControl),控件覆盖整个对话框的客户区,属于最底层的控件,在这之上放置了很多其他的小图形控件. 问题 ...
- 最短路径 dijkstra
最短路径 dijkstra #include <stdio.h> #include <string.h> #include <limits.h> #define M ...
- A Free , Fast and Small Automatic Formatter for C , C++ , C# , Java Source Codes
A Free , Fast and Small Automatic Formatterfor C , C++ , C# , Java Source Codes Indenting source cod ...