稍微改了下格式 ==
链接:https://www.zhihu.com/question/25339933/answer/32104394

我觉得要理解django的class-based-view(以下简称cbv),首先要明白django引入cbv的目的是什么。在django1.3之前,generic view也就是所谓的通用视图,使用的是function-based-view(fbv),亦即基于函数的视图。有人认为fbv比cbv更pythonic,窃以为不然。

python的一大重要的特性就是面向对象。而cbv更能体现python的面向对象。cbv是通过class的方式来实现视图方法的。class相对于function,更能利用多态的特定,因此更容易从宏观层面上将项目内的比较通用的功能抽象出来。关于多态,不多解释,有兴趣的同学自己Google。

总之可以理解为一个东西具有多种形态(的特性)。cbv的实现原理通过看django的源码就很容易明白,大体就是由url路由到这个cbv之后,通过cbv内部的dispatch方法进行分发,将get请求分发给cbv.get方法处理,将post请求分发给cbv.post方法处理,其他方法类似。怎么利用多态呢?cbv里引入了mixin的概念。

Mixin就是写好了的一些基础类,然后通过不同的Mixin组合成为最终想要的类。所以,理解cbv的基础是,理解Mixin。我们以1.5为例简单讲解一下Mixin。

python-path/Lib/site-packages/django/view/generic文件夹下,包含了django自带的几个基于类的通用视图。base.py:ContextMixin: 提供get_context_data方法,给cbv提供context_dataView: cbv的基类,提供视图分发等功能TemplateResponseMixin: 提供渲染模板等功能

TemplateView(TemplateResponseMixin, ContextMixin, View): 从类的构造上就可以看出,这个类是由TemplateResponseMixin,ContextMixin,View三个类共同继承而来的,所以同时具有这三个类的特定,因此,这个类完整的提供了一个cbv应该具有的所有动作(除了处理数据)。

RedirectView(View): 这是View的一个子类,实现的是重定向的功能。base中已经提供了构成cbv最最基础的几个Mixin,以及cbv的基类View。以下django又提供了detail,list,edit,dates四个模块,这四个模块分别用来处理detail数据(比如显示日志的某一篇的明细信息),list(比如显示某user的所有日志列表),edit(比如为用户提供新增日志和修改日志的功能),dates(比如显示2014年10月的日志)。想一下,从数据维度上讲,默认的django cbv提供了按照数据维度处理的两个不同的cbv,分别是detail和list。detail显示一个数据对象,list显示数据列表。

下面先分析detail.py:SimpleObjectMixin(ContextMixin): 这是ContextMixin的一个子类,提供最基础的取回单个对象的功能。BaseDetailView(SimpleObjectMixin, View): 提供显示单个对象的功能。SimpleObjectTemplateResponseMixin(TemplateResponseMixin): 这是对TemplateResponseMixin的再次封装,为了实现单个对象的模板显示。DetailView(SimpleObjectTemplateResponseMixin, BaseDetailView): 这就是完整的detail view了。

从以上类的继承上就可以大致猜出,detail模块中的相关cbv其实是对base中提供的mixin的再度继承从而实现更精细复杂的功能。所以剩下几个模块题主完全可以自己分析了。所以分析完了各个模块提供的功能就完了吗?如果到这里止步,那么还是不了解cbv的好处。上文说过,cbv的一大好处就是多态。因此可以把通用的功能抽象出来做成mixin给其他cbv用。比如,想实现restful API。最简单的,想实现返回json数据。写一个mixin就好了。class JSONResponseMixin(object):

“”“JSON mixin”“”

  def render_to_response(self, context):return self.get_json_response(self.convert_context_to_json(context))def get_json_response(self, content, **httpresponse_kwargs):return HttpResponse(content,content_type='application/json',**httpresponse_kwargs)def convert_context_to_json(self, context):return json.dumps(context)

怎么用呢?

class CheckRemindUtilView(JSONResponseMixin, ListView):"""Check if there is reminder need to be reminded.This view should be called every minute."""def get_queryset(self):start = timezone.now()end = start + datetime.timedelta(minutes=1)return Reminder.objects.filter(next_t__gte=start,next_t__lte=end,is_valid=True)def get(self, request, *args, **kwargs):self.object_list = self.get_queryset()if (self.get_paginate_by(self.object_list) is not Noneand hasattr(self.object_list, 'exists')):is_empty = not self.object_list.exists()else:is_empty = len(self.object_list) == 0if is_empty:ret = {'code': 42, 'msg': 'empty'}else:for object_ in self.object_list:code = exec_remind(object_)object_.previous_t = object_.next_tupdate_reminder(object_)ret = {'code': code, 'msg': 'reminded.'}return self.render_to_response(ret)

再从另一个方向举个栗子。比如需要对日志进行用户过滤,用户私有的日志只能用户自己看到,其他人看不到。那么只需要写一个PrivateObjectMixin,然后其他DetailView,ListView继承这个就好了。

class PrivateObjectMixin(object):''' Filter private object for request.user '''def filte_private(self, queryset):'''Filte private object for authenticated user.'''ordering = getattr(self, 'ordering', '-date_created')if not hasattr(self, 'request'):return querysetif not hasattr(self.request, 'user'):return querysetif self.request.user.is_authenticated():queryset = queryset.filter(Q(is_valid=True), Q(is_private=True) &Q(user__id=self.request.user.id) |Q(is_private=False))else:queryset = queryset.filter(is_valid=True, is_private=False)try:result = queryset.order_by(ordering)except FieldError:#  The model doesnot have an `ordering` field.return querysetreturn resultclass NoteListView(PrivateObjectMixin, BaseNoteListView):''' Show note list. '''def get_queryset(self):'''Get notes.'''queryset = Note.objects.all()return self.filte_private(queryset)

上面这两个例子只是简单的应用而已,完全可以借助多态实现更复杂的cbv。以下是建议部分:
1,建议翻阅django cbv的源码,自己画个图了解cbv的实现原理,继承流程。
2,自己写几个简单的cbv。
私货部分:有个django的伪专家群:69930365
基于django(django-rest-framework)的个人站:今人不见古时月

django-CBVS (转载知乎彧神)相关推荐

  1. 转载知乎大神设置普通路由器支持IPV6

    作者:Kuroko Baka 链接:https://www.zhihu.com/question/31699421/answer/63285066 来源:知乎 著作权归作者所有,转载请联系作者获得授权 ...

  2. [转]知乎大神YaqiLYU关于tracking方向的2013-2016趋势总览!!!强烈推荐!!!

    真真实实的学习tracking也有半年了,tracking的主流趋势年年改变,每年都有新的突破.从CT.IVT到struck,到TLD.到CF,再到火热的CNN也应用到了tracking领域.作为初入 ...

  3. 做知乎大神不如做个知乎,问答社区建站工具——WeCenter

    ​   "--是一种什么样的体验?"."如何看待/怎样评价--?"爱逛知乎的朋友对这些话题格式肯定不陌生,现在知乎大火,越来越多的人开始在网络上分享知识.经验, ...

  4. python 知乎美女_知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测)

    原标题:知乎大神用Python爬取高颜值美女(爬虫+人脸检测+颜值检测) 1 数据源 知乎话题『美女』下所有问题中回答所出现的图片 2 抓取工具 Python 3,并使用第三方库 Requests.l ...

  5. 高中毕业学计算机知乎,高中毕业学点什么好?知乎大神这么回答!

    原标题:高中毕业学点什么好?知乎大神这么回答! 马上就要面临高考,知乎上经常有人问"高中毕业学什么技术好?",很多人都评论说"高考只是人生的的其中一个选择,无论考上还是考 ...

  6. 心理学博士vs计算机博士,心理学博士、知乎大神告诉你怎么成为一个厉害的人...

    你是否对现状不满,而又找不到出路,flag立了一个又一个,还是没有改变,间接性努力,持续性混吃混喝,反倒是身边的一些朋友在悄悄地改变. 前同事小王裸辞后成为自由撰稿人,时间自由,经济独立,随时可以来一 ...

  7. python 知乎美女_知乎大神教你用Python爬取网站美女图,附代码!

    都知道Python的抓取功能强大,可以帮我们从海量的数据中爬取所需要的进行分析.下面,就给大家分享知乎大神怎么用Python爬取高颜值美女! 1.数据源 知乎话题『美女』下所有问题中回答所出现的图片 ...

  8. 机器学习:3 个知乎大神回答、5 个新人常见问题和 3 个学习规划

    最近一位转型 AI 的朋友抱怨,"走过的最远的路,就是机器学习过程中的弯路",然后开始各种 blablabla,从论文的坑,到模型的坑,再到培训的坑-一路吐槽. 文章来源于AIQ ...

  9. R 中的哪些命令或者包让你相见恨晚?--转载知乎

    https://www.zhihu.com/question/24501195 节选: 看了这么多答案,觉得 Hadley Wickhamhad.co.nz 在R使用者的地位好高啊.其实我也觉得Had ...

最新文章

  1. Android 学习笔记
  2. ArrayAdapter的使用
  3. 剑指Offer(Java实现)把字符串转换成整数
  4. android百分比布局适配,安卓屏幕适配-百分比布局
  5. 第十届 蓝桥杯样题 —— 5个砝码
  6. RocketMQ入门
  7. SAP Spartacus 用户请求中的 current id 是从哪里来的
  8. [蓝桥杯][2014年第五届真题]兰顿蚂蚁(模拟)
  9. redisTemplate设置key零点过期,生成自增的单号
  10. LeetCode 121:买卖股票的最佳时机 思考分析
  11. Qt工作笔记-UDP多线程数据处理及发送(简单实例)
  12. 关于RN报Unrecognized font family ionicons
  13. 银行的USB KEY里面包含的是什么
  14. 【Python】bar柱状(条形)图(带均值和标准差)
  15. 无涯教程 - Latex 格式(Format)
  16. 学生php作业,作业作业作业作业作业
  17. Ubuntu16.04下firefox flash过期问题
  18. 有关wifi配置工具wpa_cli以及wpa_supplicant简单分析
  19. TCX推出前沿货币债券指数
  20. SwitchyOmega插件安装

热门文章

  1. Kali渗透测试-远程控制:6200端口变成“后门”
  2. 视频转文字怎么转,3个办法教你将视频里的语音转文字
  3. 蓝桥杯软件组如何混进省一
  4. 深圳南山科技园一公司年终发10台高尔夫奖优秀员工
  5. 用FastAPI加爬虫制作一个涩图API,521就这样自己过。
  6. 跨平台应用程序开发方法大盘点
  7. 51单片机之按键(独立按键矩阵按键)
  8. 四大Hybrid App移动开发平台对比
  9. c语言实现股票软件cost函数,高仿真(主图){源码 有成本未来函数COST}
  10. 可执行文件的装载与进程