Django 基于类的视图源码分析 一

Stella981
• 阅读 428

基于类的视图(Class-based view)是Django 1.3引入的新的视图编写方式,用于取代以前基于函数(Function-based)方式。 借助于OO和Python中方便的多重继承特性,基于类的视图可以提供更好的抽象与复用能力。 新的通用视图将更加优雅。

Django的文档较为丰富,但在实际开发中往往仍显得不够,很多时候还是需要深入到源代码当中一探究竟。为此,仔细整理了一下基于类的视图的实现方式。期望对以后的开发能够提供更加清晰、直接的参考。

说明: Django大量应用了多重继承特性。将一些通用的功能性代码拆分混入类(Mixin),需要这些混入类的代码时,只需要将混入类加入到类的继承列表中即可——请注意顺序,左侧的类具有较高权限,将覆盖右侧继承类中的同名函数。为了说明方便,将这些混入类(Mixin)成为"工具类"。

源码组织

所有的视图相关代码,均存放与django/views/generic目录中:

  • base.py 保存视图的抽象类,TemplateView和RedirectView,及工具类TemplateResponseMixin的代码

  • create_update.py 基于函数的通用视图。已标记为_deprecated_

  • date_based.py 基于函数的日期相关通用视图。已标记为_deprecated_

  • dates.py 新的基于类的日期相关通用视图。用于取代date_based.py

  • detail.py 基于类的单个对象显示相关的视图和工具类

  • edit.py 基于类的对象编辑相关的视图和工具类

  • list.py 基于类的对象列表显示相关视图和工具类

  • list_detail.py 基于函数的列表、显示函数。已标记为_deprecated_

  • simply.py 基于函数的工具常用工具试图。已标记为_deprecated_

从逻辑上来看,源代码被组织为抽象基类,工具类(Mixin),常规(具体)实现和基于模型的实现。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Wesley13 Wesley13
2年前
mysql(视图 事务 索引 外键)
视图视图本质就是对查询的封装创建视图(定义视图 起名以v\_开头)createviewv\_studentsasselectclasses.nameas c\_name,students.\fromstudentsinnerjoinclassesonstudents.cls\_idclasses.id;查
Stella981 Stella981
2年前
Django 基于类的视图源码分析 二
源码分析抽象类和常用视图(base.py)这个文件包含视图的顶级抽象类(View),基于模板的工具类(TemplateResponseMixin),模板视图(TemplateView)和重定向视图(RedirectView)。!base.py(http://static.oschina.net/u
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
Django 基于类的视图源码分析 三
列表类通用视图(list.py)此文件包含用于显示数据列表常用的类和工具类。不仅可以方便的用于显示基于模型(Model)的数据列表,也可以用于显示自定义数据列表。!list.py类图(http://static.oschina.net/uploads/space/2013/0219/161042_iKka_233
Easter79 Easter79
2年前
SwiftUI 跨组件数据传递
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言众所周知,SwiftUI的开发模式与React、Flutter非常相似,即都是声明式UI,由数据驱动(产生)视图,视图也会与数据自动保持同步,框架层会帮你处理“绑定”的问题。在声明式UI中不存在命令式地让一个视图变成xxx
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这