一、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)对比的更多相关文章

  1. Django 学习视图之FBV与CBV

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

  2. Django - 自定义分页、FBV和CBV

    一.自定义分页(优势在于能够保存搜索条件) """ 分页组件使用示例: 1) 先取出所有数据USER_LIST 2) 实例化: obj = Pagination(requ ...

  3. Django生命周期,FBV,CBV

    一. Django生命周期 首先我们知道HTTP请求及服务端响应中传输的所有数据都是字符串,在Django中,当我们访问一个的url时,会通过路由匹配进入相应的html网页中.Django的请求生命周 ...

  4. Android中View绘制优化之三---- 优化View

    本文原创, 转载请注明出处:http://blog.csdn.net/qinjuning 译三: 优化视图 关于如何设计自定义View以及响应触摸时间等,请看Android developer : 地 ...

  5. 2) 接口规范 原生django接口、单查群查 postman工具 CBV源码解析

    内容了解 """ .接口:什么是接口.restful接口规范 .CBV生命周期源码 - 基于restful规范下的CBV接口 .请求组件.解析组件.响应组件 .序列化组件 ...

  6. View学习(四)-View的绘制(draw)过程

    View的draw过程相比之于measrue过程,也是比较简单的.并且在我们自定义View时,也经常需要重写onDraw方法,来绘制出我们要实现的效果. 如之前的文章所说,绘制的流程也是起始于View ...

  7. View (五)自定义View的实现方法

    一些接触Android不久的朋友对自定义View都有一丝畏惧感,总感觉这是一个比较高级的技术,但其实自定义View并不复杂,有时候只需要简单几行代码就可以完成了. 如果说要按类型来划分的话,自定义Vi ...

  8. 在Android中将子View的坐标转换为父View的坐标

    在Android中,我们有时候可能会将子View的坐标转换为父View中的坐标.感觉很有用,分享给大家. 在Launcher中有这么一段代码可以完成这项工作.  public float getDes ...

  9. 【转】Android绘制View的过程研究——计算View的大小

    Android绘制View的过程研究——计算View的大小 转自:http://liujianqiao398.blog.163.com/blog/static/18182725720121023218 ...

随机推荐

  1. Mac OSX系统安装和配置Zend Server 6教程(2)

    继上一节安装好Zend Server 6以后,我们需要修改配置文件.首先修改服务器监听端口.默认的情况下Zend Server 6安装以后的端口是10088.一般开发者使用的都是HTTP默认端口80. ...

  2. 如何用CSC.exe来编译Visual C#的代码文件

    原文:如何用CSC.exe来编译Visual C#的代码文件 C#的编译过程      如何用CSC.exe来编译Visual C#的代码文件   Csc.exe 编译器的位置路径:C:\Window ...

  3. nginx 502 Bad Gateway 错误问题收集

    nginx 502 Bad Gateway 错误问题收集 (2010-11-18 13:51:37) 转载▼ 标签: 杂谈 分类: 工作 nginx 502 Bad Gateway 错误问题收集 因为 ...

  4. 自己写RTPserver——大约RTP协议

    自己写RTPserver--大约RTP协议 本文将带领你一步一步地实现一个简单的手RTP变速器server,旨在了解RTP流媒体传输协议以及有关多媒体编解码器的一些知识. RTP协议的必备知识 要动手 ...

  5. [QT Creator]LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 。

    这个问题很恶心!网上说的原因是因为安装了多了版本的VS.在高版本的2010和2012上都会有问题,解决方法是使用visual studio 2008安装目录下的一个文件替代vs2010安装目录下的文件 ...

  6. StackTrace堆栈跟踪记录详细日志

    使用StackTrace堆栈跟踪记录详细日志(可获取行号) 2014-04-25 22:30 by 螺丝钉想要螺丝帽, 350 阅读, 3 评论, 收藏, 编辑 上一篇我们提到使用.NET自带的Tra ...

  7. Aforge.net 一个专门为开发者和研究者基于C#框架设计

    时间过得真快啊,转眼今年就要过去了,大半年都没有写博客了,要说时间嘛,花在泡妹子和搞英语去了,哈哈...前几天老大问我 怎么这么长时间都没写博客了,好吧,继续坚持,继续分享我的心得体会. 这个系列我们 ...

  8. [转]ARM/Thumb2PortingHowto

    src: https://wiki.edubuntu.org/ARM/Thumb2PortingHowto#ARM_Assembler_Overview When you see some assem ...

  9. MVC test

    1,index @{ ViewBag.Title = "Index"; } <!DOCTYPE html> <html> <head> < ...

  10. 基于Redis的CustomerSessionProvider(二)

    接一的考虑,那么就做Redis的SessionProvider就非常简单了,只考虑整个Session的缓存,主要实现以下两个函数就可以了 public override SessionStateSto ...