Django框架
1、总体结构
Django是MTV结构,即:Model, Template, View
- Model:定义数据的存储格式,并且提供了数据库访问的API。
- View:定义那些数据被显示,是业务逻辑处理模块。
- Template:定义数据如何被显示。
Django工程包含工程的配置、及多个APP,每个APP完成相对独立的功能。在设计中,要尽量保持每个APP的独立性,以做到APP是即插即用。

(1)MVC(MVT)架构的本质
其实本质上就是个目录文件夹的功能划分而已,我们平时写比较复杂的Python程序的时候,也要进行类似的分类,不然的话,我们书写的逻辑,我们要加载的HTML代码,以及与数据库有关的代码,全部写到一个文件里边,就会导致以后很难地去维护,那么这时候MVC就出来了
所以:
- MVC就是对文件夹的一个分类,对它们职责的一个划分
- 别人问你什么是MVC啊,你就说我刚好写的Python分类的文件夹就是MVC啊
2、交互关系

(1)用户通过浏览器向我们的服务器发起一个请求(request),这个请求会URL通过URLConf模块映射到View函数,将HttpRequest对象作为参数传入;
(2)a.如果不涉及到数据调用,那么这个时候视图函数直接返回一个模板也就是一个网页给用户。
b.如果涉及到数据调用,那么视图函数通过Model访问数据库,进行业务逻辑运算得到输出数据,然后逐级返回。
(3)视图函数把返回的数据填充到模板(Template)中空格,加载Template,根据输出数据生成页面,将HttpResponse对象返回
上图中圆圈代表请求,当客户端向服务端发起请求的时候,请求首先到Django的路由系统,如果我们客户端发过来的URL与Django路由系统里的某个URL相同的话,会匹配到这个URL对应的视图函数,这个对应关系程序运行起来就已经放到我们的服务器内存里面了, 然后视图函数可以去数据库里面拿数据,也可以渲染HTML页面返回给浏览器
3、Model
- 通常情况,一个Models对应数据库的一张表
- Django中Models以类的形式表现
- 我们只需要在类里面进行操作,就可以操作数据库,表,不需要直接使用SQL语句
- 我们通过创建类来创建数据表,所以对数据库的操作,都是对类与对类的对象进行操作,而不使用sql语句
- 一个类对应于数据库中的表(Table),类属性对应于表的字段(Field)。
- 从 django.db.models.Model 派生,支持继承。
- 要使用一个APP时,需要将该APP的Model添加到工程的 settings.py INSTALLED_APPS 中。
3.1 models的属性与字段(field)
1.field类型
-
AutoField:一个自动递增的整形字段,通常用于主键
-
CharField:字符串字段,用于输入较短的字符,对应与HTML里面
-
TextField:文本字段,用于输入较多的字符,对应html标签 ;
-
EmailField:邮箱字段,用于输入带有Email格式的字符
-
DateFiled
-
TimeFiled
-
DateTimeField:日期字段,支持时间输入
-
ImageField:用于上传图片并验证图片合法性,需定义upload_to参数,使用本字段需安装python pillow等图片库
-
IntegerField:整数字段,用于保持整数信息
2.field属性
- primary_key:设置True or False,定义此字段是否为主键
- default:设置默认值,可以设置默认的文本、时间、图片、时间等
- null:设置True or False,是否允许数据库字段为Null,默认为False
- blank:设置True or False,定义是否运行用户不输入,默认为False;若为True,则用户可以不输入此字段
- max_length:设置默认长度,一般在CharField、TextField、EmailField等文本字段设置
- verbose_name:设置该字段的名称,所有字段都可以设置,在Web页面会显示出来(例如将英文显示为中文)
- choices:设置该字段的可选值,本字段的值是一个二维元素的元祖;元素的第1个值为实际存储的值,第2个值为HTML页面显示的值
- upload_to:设置上传路径,ImageField和FileField字段需要设置此参数,如果路径不存在,会自动创建
3.Meta类属性
- verbose_name:设置对象名称(例如usecms),若没有设置,则默认为该类名的小写分词形式,例如类名为CamelCase会被转换为camel case;
- verbose_name_plural:设置对象名称复数(例如usercms),一般设置跟verbose_name一样,verbose_name_plural=verbose_name否则会默认加s;
- db_table:设置映射的数据表名,默认为“应用名_模型名”,即用该模型所在app的名称加本模型类的名称
proxy:设置True or False,设置本模型及所有继承本模型的子模型是否为代理模型; - abstract:设置True or False,设置本模型类是否为抽象基类;如果是抽象基类,那么是不会创建这张表的,这张表用来作为基类被其他的表继承
3.2 model层的命令详解
- python manage.py makemigrations+名字:# 生成数据库表的初始化文件initial.py文件
- python manage.py migrate# # 基于数据库表初始化文件initial.py文件,正式生成数据表
- python manage.py sqlmigrate polls 0001查看数据库的生成语句,因为initial.0001是数据库表的初始化文件
4、View
View代表一种应用, 返回被请求的页面。 View要实现两个功能:URL的分发处理,定义View函数。
(1)URL分发处理
使用正则表达式定义 URL pattern,建立到View函数的映射关系。
1)环境配置
- settings.ROOT_URLCONF:定义URL的配置文件位置;
- settings.urlpatterns:定义URL patterns 到View函数的映射关系;
2)URLpattern 匹配的范围:
- 不包含domain
- 不包含GET, POST参数
- 匹配后的参数作为字符串传入view function
3)从匹配结果到函数参数
- 传送给View函数的第一个参数是HttpRequest对象,正则表达式匹配的内容作为第二个参数传入。
- 可以使用Named groups,将匹配的部分作为keyword参数。
- 格式:(?P
pattern)
4)避免重复定义的机制
- view prefix:提取view function的公共前缀
- Including other URLconf
(2)View函数
接收Web请求,返回Web响应,基本的处理流程是
- 收到传入的HttpRequest参数;
- 从HttpRequest中获得输入数据;
- 进行数据处理,构造Context数据;
- 加载Template;
- 使用Context数据Render Template;
- 返回 HttpResponse;
1)相关的类
- class HttpRequest:通过POST或GET属性访问传入的参数
- class HttpResponse:主要派生类有 class HttpResponseRedirect,class HttpResponseNotFound
- class UploadedFile
- class QueryDict:multiple values for the same key
2)快捷函数
- render
- render_to_response
- redirect
- get_object_or_404
- get_list_or_404
5、Template
Template用于描述数据的表现,不包含业务逻辑处理。Django不是简单的将Python语言嵌入到HTML代码中,而是定义了一套标记,用于实现对HTML中数据的控制。通过变量访问数据,通过TAG控制Template的处理逻辑。
(1)变量
- 格式:{{ variable }}
(2)TAG
- 格式:
- 常用的有:for/if/block and extends
(3)过滤器功能
- 格式:{{ name|lower }}
- 例:{{ value|default:"nothing" }}
- 常用内置的过滤器:default, length, striptags
(4)Template继承
- 使用block/extend实现。
- 在父模板中,使用block定义扩展点。
- 在派生模板中,使用extend对扩展点进行重新定义。也可以引用父模板中的定义,使用{{ block.super }} 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?