读懂一个中型的Django项目
转自https://www.cnblogs.com/huangfuyuan/p/Django.html
【前言】中型的项目是比较多的APP,肯会涉及多数据表的操作。如果有人带那就最好了,自己要先了解基本的django框架(MTV ,ORM等)师傅可以给讲解一下框架怎么组织url.py,model.py,admin.py,view.py,.html顺序的,弄懂一个app。其他的也就触类旁通了。由于使用的django框架公司没人用过,将自己摸索学习的过程记录一下。
一、工程项目介绍
1、一个erp管理系统,41个文件目录,190个文件,还算是一个中型的项目。好在里面的APP有相似的,无需全部搞懂所有的,只需搞懂那么一个,触类旁通。

2、运行界面

二、先看一个完整的从请求到响应
网上一张完整的图:

1. 用户通过浏览器请求一个页面
2. 请求到达Request Middlewares,中间件对request做一些预处理或者直接response请求
3. URLConf通过urls.py文件和请求的URL找到相应的View
4. View Middlewares被访问,它同样可以对request做一些处理或者直接返回response
5. 调用View中的函数
6. View中的方法可以选择性的通过Models访问底层的数据
7. 所有的Model-to-DB的交互都是通过manager完成的
8. 如果需要,Views可以使用一个特殊的Context
9. Context被传给Template用来生成页面
a.Template使用Filters和Tags去渲染输出
b.输出被返回到View
c.HTTPResponse被发送到Response Middlewares
d.任何Response Middlewares都可以丰富response或者返回一个完全不同的response
e.Response返回到浏览器,呈现给用户
参考:https://blog.csdn.net/a289237642/article/details/81213067
三、正式分析
分析的前提,默认已经设置好所有的数据库,可以运行工程,就差读懂代码。
wsgi到中间件就略过了,我们分析主要的程序!!
1、先找到seting.py所在的目录

2、打开url.py

可以看到,有初始的admin对应的view,后面两个是分APP所在的目录对应的url.py,所以url.py不止一处。
3、打开workflow.view.start函数
view里面的函数都是对数据库的操作,是对数据的承上启下作用,我们看箭头指的那个表Modal(models.py里面的类)

4、在view.py的同级目录下,找到admin.py
这里他进行了Mddal类的绑定:

找到后面那个绿色区域的类,那里就是web后台。django自带的后台管理。所谓后台,就是对model.py里面定义的数据库字段,进行前台显示。

5、我们找到modal所在的models.py,这里面是对数据库中字段的定义,“=”左边是数据库中的字段名,右边“workflow code”是可以自己命名的,将显示在前端。可以命名成汉字。打开:

里面是对列的定义。类名就是表名,类里面的字段代表数据表中的字段(code),数据类型则由CharField(相当于varchar)、DateField(相当于datetime), max_length 参数限定长度。具体里面models的函数,参考:https://www.cnblogs.com/dreamkeeper/p/7623894.html
其对应的数据库里面的字段:

6、如此,我们的代码和数据库交互了起来,我们可以在view()中对数据库进行增删改查,view()中还要负责将数据映射到html文件中,html再动态链接css渲染,输出到界面。注意,我们的分析过程并不是一条直线,在view()处分成了两路。view()往下的我们分析过了,下面分析view()往上到达html的。
7、还是回到view.py,找到start函数,在类的最后我们看到了类的调用:

调用了******.html文件
8、html文件里面包含太多继承,除了base.html可以看懂,其他的我基本看不懂。那咋办呢?——我一般是打开对应的网页,然后看网页源码,这样将源码和其对应的html文件对比,也能明白个差不多。
html语言弄懂标签就简单了。
三、实战一个例子
1、basedata中的model.py
class ExpenseAccount(generic.BO):
"""
基金账户
"""
index_weight = 10
status= models.CharField(_("基金ID"),max_length=const.DB_CHAR_NAME_120)
qhzh = models.CharField(_("期货账户"),max_length=const.DB_CHAR_NAME_120)
code = models.CharField(_("期货入金"),max_length=const.DB_CHAR_NAME_20,blank=True,null=True)
yhzh = models.CharField(_("银行账户"),max_length=const.DB_CHAR_NAME_120)
name = models.CharField(_("银行入金"),max_length=const.DB_CHAR_NAME_120) description = models.TextField(_("备注"),blank=True,null=True)
parent = models.ForeignKey('self',verbose_name=_("parent"),null=True,blank=True) class Meta:
verbose_name = _('expenses account')
verbose_name_plural = _('基金账户')
#对记录的排序,两个是二级排序
ordering = ['-modification','status']
2、admin.py
class ExpenseAdmin(generic.BOAdmin):
list_display = ['status','qhzh','code','yhzh','name','modification','description']
list_display_links = ['code','name']
search_fields = ['name']
三、小结
django框架是比其他框架复杂一些,基于mvt架构理论理清其中url,models,view,admin,html几者的关系就简单了。在复杂一些的django项目,也就是增加了APP的数量。当然此时会涉及更多的框架之外的知识,比如数据库表的一对多等等。需要多看,多学习吧!我又浅尝辄止了......
参考:https://www.cnblogs.com/yangmv/p/5327477.html
读懂一个中型的Django项目的更多相关文章
- 新手怎么读懂一个中型的Django项目
[前言]中型的项目是比较多的APP,肯会涉及多数据表的操作.如果有人带那就最好了,自己要先了解基本的django框架(MTV ,ORM等)师傅可以给讲解一下框架怎么组织url.py,model.py, ...
- Django入门第一步:构建一个简单的Django项目
Django入门第一步:构建一个简单的Django项目 1.简介 Django是一个功能完备的Python Web框架,可用于构建复杂的Web应用程序.在本文中,将通过示例跳入并学习Django.您将 ...
- 使用一个Python脚本来运行一个简单的Django项目
创建视图 Django是一个模型-模板-视图(model-template-view,MTV)框架. 视图部分通常检查看HTTP给出的请求和查询或者结构,这些信息是发送到表示层的数据. 我们在 hel ...
- 创建一个简单的Django项目
1.首先,启动pycharm,点击File->New Project,如下图所示. 2.在New Project对话框中,选择Django,在Location中设置项目路径以及项目名称,在App ...
- bae3.0第二步 添加一个空的django项目
1.创建django项目: 进入bae应用源码目录(appidd01iud80bg)执行django-admin.py startproject blog2.修改index.py的内容如下所示 #-* ...
- 三 vue学习三 从读懂一个Vue项目开始
源码地址: https://github.com/liufeiSAP/vue2-manage 我们的目录结构: 目录/文件 说明 build 项目构建(webpack)相关代码. config ...
- 创建一个规范的django项目
1. 创建项目 2. 创建static目录及配置 1.创建放css, javascript,img的目录 2.在settings.py中将static绝对路径保存到变量STATICFILES_DIRS ...
- 第一个Django项目
安装 pip install Django==2.0.5 命令行下创建Django项目 django-admin startproject first_project # 创建项目 cd first_ ...
- 线上Django项目python2到3升级日记
这两天干了一个几斤疯狂的事情,花不到一个工作日的时间把一个线上Django项目语言版本从python2升级到Python31.字典的一个语法变化 Python2.7: if dict1.haskey( ...
随机推荐
- Pytest(3)fixture的使用
fixture的优势 Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进: 命名方式灵活,不局限于 setup 和teardown 这几个命名 conf ...
- .net core Api 部署到Linux
一.环境介绍 1..net开发环境:asp.net core 3.1 2.Linux环境:CentOS Linux release 7.9.2009 (Core) 3.Swagger: Swashbu ...
- Codeforces Round #656 (Div. 3) C. Make It Good
题目链接:https://codeforces.com/contest/1385/problem/C 题意 去除一个数组的最短前缀使得余下的数组每次从首或尾部取元素可以排为非减序. 题解一 当两个大数 ...
- Codeforces Round #647 (Div. 2) - Thanks, Algo Muse! A、Johnny and Ancient Computer B、Johnny and His Hobbies C、Johnny and Another Rating Drop
题目链接:A.Johnny and Ancient Computer 题意: 给你两个数a,b.问你可不可以通过左移位运算或者右移位运算使得它们两个相等.可以的话输出操作次数,不可以输出-1 一次操作 ...
- 20162017-acmicpc-south-pacific-regional-contest-sppc-16 B.Ballon Warehouse
题意:给你一个无限长且元素均为\(0\)的排列,每次给你一对\((x,y)\),表示在所有\(x\)的后面插入一个元素\(y\),最后给你一个区间\((l,r)\),输出\([l,r-1]\)中的所有 ...
- zjnu1181 石子合并【基础算法・动态规划】——高级
Description 在操场上沿一直线排列着 n堆石子.现要将石子有次序地合并成一堆.规定每次只能选相邻的两堆石子合并成新的一堆, 并将新的一堆石子数记为该次合并的得分.允许在第一次合并前对调一 ...
- 在异步或子线程中show窗体的时候要用MethodInvoker委托,要不然show不出来
this.Invoke((MethodInvoker)delegate () { Thread.Sleep(500); this.Hide(); FloatWnd floatWnd = new Flo ...
- OpenStack Train版-10.安装neutron网络服务(网络节点:可选)
可选:安装neutron网络服务节点(neutron01网络节点192.168.0.30)网络配置按照官网文档的租户自助网络 配置系统参数 echo 'net.ipv4.ip_forward = 1' ...
- kubernetes进阶(五)dashboard--WEB管理
dashboard是k8s的可视化管理平台,是三种管理k8s集群方法之一 首先下载镜像上传到我们的私有仓库中:hdss7-200 # docker pull k8scn/kubernetes-dash ...
- 多线程(一)java并发编程基础知识
线程的应用 如何应用多线程 在 Java 中,有多种方式来实现多线程.继承 Thread 类.实现 Runnable 接口.使用 ExecutorService.Callable.Future 实现带 ...