赞
踩
欢迎进入Django的世界!如果你对开发数据库驱动的网站感兴趣,Django是一个非常有用的框架。在这篇博文中,我们将介绍Django的基础知识,包括它的历史、特点、如何开始学习,以及一些使用Django的知名网站。
Django 是一个用于构建 Web 应用程序的高级 Python Web 框架。
Django 提供了一套强大的工具和约定,处理了Web开发中的许多繁琐事务,使得开发者可以专注于编写网站独特的业务逻辑部分,快速构建功能齐全且易于维护的网站。
Django 遵守 BSD 版权,初次发布于 2005 年 7 月, 并于 2008 年 9 月发布了第一个正式版本 1.0 。
Django 采用了 MVT 的软件设计模式,即模型(Model),视图(View)和模板(Template)。
Django诞生于2003年,最初是为了满足新闻网站的需求而开发的。
2005年7月21日,Django被公开发布,并在BSD许可证下提供。
如今,Django已经发展成为一个由全球社区支持的成熟框架。
Django框架的历史始于2003年秋,当时位于劳伦斯《日报世界》报社的网络程序员Adrian Holovaty和Simon Willison开始使用Python构建应用程序。在Django开发的早期,Jacob Kaplan-Moss被聘请加入,这是在Simon Willison的实习结束前不久。
Django最初是为了满足新闻网站的需求而开发的,它的目标是简化复杂、数据库驱动网站的创建。Django强调组件的可重用性和“插件化”,以及少量代码、低耦合、快速开发和不重复自己(DRY)的原则。
2005年7月21日,Django被公开发布,并在BSD许可证下提供。框架的命名是为了纪念吉他手Django Reinhardt,Adrian Holovaty是一位罗姆人爵士吉他演奏者,他的音乐部分地启发了Reinhardt。
到了2008年6月,宣布新成立的Django软件基金会(DSF)将在未来维护Django。DSF是在美国成立的一个独立组织,是一个501©(3)非营利组织。
如今,Django已经发展成为一个由全球社区支持的成熟框架,它的最新稳定版本是5.0.6,于2024年5月7日发布1。Django继续是许多开发者和公司构建现代Web应用程序的首选框架。
国外网站:
国内网站:
这些网站的成功运营证明了Django作为一个Web框架的可靠性和高效性。
Django的设计哲学、安全性和快速开发的特点使其成为许多开发者和公司的首选框架。
完整性:提供几乎所有开发者可能想要的功能“开箱即用”。
多功能性:Django可以(也已经)被用来构建几乎任何类型的网站。
安全性:Django对待安全问题的态度:致力于帮助开发者避免常见的安全错误,提供一个旨在自动保护网站的框架。
快速开发:Django旨在帮助开发者从概念到完成尽可能快地开发应用程序。
可扩展性:适用于流量最繁忙的网站。
DRY原则:强调组件的可重用性,遵循不要重复自己的原则。
Django 处理了Web开发中的许多繁琐事务,比如: 用户认证、数据库连接、CRUD(创建、读取、更新、删除)操作、URL路由、表单处理和安全性等,这样开发者就可以专注于编写使网站独特的业务逻辑部分,而不需要重新发明轮子。
Django遵循“包含电池”的理念,提供了几乎所有开发者可能想要的功能“开箱即用”。因为你需要的一切都是框架的一部分,所以它们可以无缝协同工作,遵循一致的设计原则,并且拥有广泛且最新的官方文档。
Django遵循MVT(模型-视图-模板)架构:
如果你对创建数据库驱动的网站感兴趣,Django是一个非常有用的框架。
它的ORM(对象关系映射)技术使得与数据库的交流变得更加简单,无需编写复杂的SQL语句。Django还强调组件的可重用性,遵循DRY(不要重复自己)的原则。
确定你要使用的 Django 版本。
Django
是 BSD 许可 下的开源版本。建议使用最新版本的 Python 3.x 。
因为新版本的 Python 通常会更快,拥有更多特性,而且有更好的支持,推荐使用 Python 3 的最新版本。
使用旧版本的 Django 不会损失任何东西,但你不能利用新版本的 Python 的改进和优化。
与 Django 一起使用的第三方应用程序可以自由设置自己的版本要求。
Django 版本对应的 Python 版本:
Django 版本 | Python 版本 |
---|---|
1.8 | 2.7、3.2(until the end of 2016)、3.3、3.4、3.5 |
1.9、1.10 | 2.7、3.4、3.5 |
1.11 | 2.7、3.4、3.5、3.6、3.7(added in 1.11.17) |
2.0 | 3.4, 3.5, 3.6, 3.7 |
2.1 | 3.5, 3.6, 3.7 |
2.2 | 3.5、3.6、3.7、3.8 (added in 2.2.8)、3.9 (added in 2.2.17) |
3.1 | 3.6、3.7、3.8、3.9(added in 3.1.3) |
3.2 | 3.6、3.7、3.8、3.9、3.10(added in 3.2.9) |
4.0 | 3.8、3.9、3.10 |
4.1 | 3.8、3.9、3.10、3.11(added in 4.1.3) |
4.2 | 3.8、3.9、3.10、3.11、3.12(added in 4.2.8) |
5.0 | 3.10、3.11、3.12 |
5.1 | 3.10、3.11、3.12 |
5.2 | 3.10、3.11、3.12、3.13 |
通常情况下,如果在生产环境中使用代码,应该使用稳定版本。
Django 项目大约每八个月发布一个完整的稳定版本,并在其间发布错误修复更新。
这些稳定版本包含我们向后兼容性保证所覆盖的 API;如果你针对稳定版本编写代码,在下一个官方版本发布时升级应该不会有任何问题。
功能版本(AB、A.B+1 等)大约每八个月发布一次。这些版本将包含新功能、对现有功能的改进等。
补丁版本(ABC 等)将根据需要发布,以修复错误和/或安全问题。这些版本将与相关功能版本 100% 兼容,除非出于安全原因或为了防止数据丢失而无法兼容。因此,“我应该升级到最新补丁版本吗?”的答案永远是“是”。
某些功能版本将被指定为长期支持 (LTS) 版本。这些版本将在保证的一段时间内(通常为三年)应用安全和数据丢失修复。
发布系列 | 最新发布 | 主流支持终止 | 延长支持结束 |
---|---|---|---|
5.0 | 5.0.6 | 2024 年 8 月 | 2025 年 4 月 |
4.2 长期支持版本 | 4.2.13 | 2023 年 12 月 4 日 | 2026 年 4 月 |
未来版本路线图
发布系列 | 发布日期 | 主流支持终止 | 延长支持结束 |
---|---|---|---|
6.1 | 2026 年 8 月 | 2027 年 4 月 | 2027 年 12 月 |
6.0 | 2025 年 12 月 | 2026 年 8 月 | 2027 年 4 月 |
5.2 长期支持版本 | 2025 年 4 月 | 2025 年 12 月 | 2028 年 4 月 |
5.1 | 2024 年 8 月 | 2025 年 4 月 | 2025 年 12 月 |
开始使用 Django 前你需要了解一些基础的 Web 知识及 Python 基础知识。
- Python知识点:函数、面向对象。
- 前端开发:Web 基础、HTML、CSS、JavaScript 。
函数、面向对象
函数 是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。Python已经提供了许多内建函数,比如print()
。但你也可以自己创建函数,这被叫做用户自定义函数。
定义一个自己的函数,以下是简单的规则:
def
关键词开头,后接函数标识符名称和圆括号 ()
。return [表达式]
结束函数,选择性地返回一个值给调用方,不带表达式的 return
相当于返回 None
。语法:
# Python 定义函数使用 def 关键字,一般格式如下:
def 函数名(参数列表):
函数体
# 默认情况下,参数值和参数名称是按函数声明中定义的顺序匹配起来的。
函数调用
定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。
参数传递
在 python 中,类型属于对象,对象有不同类型的区分,变量是没有类型的。
参数
以下是调用函数时可使用的正式参数类型:
# 加了星号 * 的参数会以元组(tuple)的形式导入,存放所有未命名的变量参数。
def functionname([formal_args,] *var_args_tuple ):
# 函数_文档字符串
function_suite
return [expression]
# 加了两个星号 ** 的参数会以字典的形式导入。
def functionname([formal_args,] **var_args_dict ):
# 函数_文档字符串
function_suite
return [expression]
Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。
面向对象 的一些 基本特征:
和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
Python中的类提供了面向对象编程的所有基本功能:
类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
对象可以包含任意数量和类型的数据。
类定义
语法格式如下:
class ClassName:
<statement-1>
.
.
.
<statement-N>
类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性。
类对象
类对象支持两种操作:属性引用和实例化。
属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name
。
类对象创建后,类命名空间中所有的命名都是有效属性名。
类的方法
在类的内部,使用 def
关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self
, 且为第一个参数,self
代表的是类的实例。
#!/usr/bin/python3 #类定义 class people: #定义基本属性 name = '' age = 0 #定义私有属性,私有属性在类外部无法直接进行访问 __weight = 0 #定义构造方法 def __init__(self,n,a,w): self.name = n self.age = a self.__weight = w def speak(self): print("%s 说: 我 %d 岁。" %(self.name,self.age)) # 实例化类 p = people('runoob',10,30) p.speak()
执行以上程序输出结果为:runoob 说: 我 10 岁。
继承
Python 同样支持类的继承,如果一种语言不支持继承,类就没有什么意义。派生类的定义如下所示:
class DerivedClassName(BaseClassName):
<statement-1>
.
.
.
<statement-N>
子类(派生类 DerivedClassName)会继承父类(基类 BaseClassName)的属性和方法。
BaseClassName(实例中的基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
多继承
Python同样有限的支持多继承形式。多继承的类定义形如下例:
class DerivedClassName(Base1, Base2, Base3):
<statement-1>
.
.
.
<statement-N>
需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。
方法重写
如果你的父类方法的功能不能满足你的需求,你可以在子类重写你父类的方法
类属性与方法
类的私有属性
__private_attrs
:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
。
类的方法
在类的内部,使用 def
关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数 self
,且为第一个参数,self
代表的是类的实例。
self 的名字并不是规定死的,也可以使用 this
,但是最好还是按照约定使用 self
。
类的私有方法
__private_method
:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods
。
类的专有方法:
__init__
: 构造函数,在生成对象时调用__del__
: 析构函数,释放对象时使用__repr__
: 打印,转换__setitem__
: 按照索引赋值__getitem__
: 按照索引获取值__len__
: 获得长度__cmp__
: 比较运算__call__
: 函数调用__add__
: 加运算__sub__
: 减运算__mul__
: 乘运算__truediv__
: 除运算__mod__
: 求余运算__pow__
: 乘方web框架底层
我们自己写时,通过socket模块可以实现网络上的两端进行通信。
import socket # 1.监听本机的IP和端口 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('192.168.10.3', 8001)) # 我自己的电脑IP(通过ip可以找到电脑, 通过端口可以找到我的程序),端口8001 # 2.让多少人等待 sock.listen(5) while True: # 3.等待连接请求的申请,有人来连接(阻塞) conn, addr = sock.accept() # 4.连接成功后立即发送 conn.sendall("欢迎使用xx系统".encode("utf-8")) # 5.断开连接 conn.close() # 6.停止服务端程序 sock.close() # 绑定本机ip和程序(端口) 然后让其他人来连接 连接了就获取con和add 然后发送消息
import socket
# 1. 向指定IP发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.10.3', 8001))
# 2. 接收你发的消息
message = client.recv(1024) ##recvive 接受发送的消息
print(message.decode("utf-8"))
# 3.断开连接
client.close()
import socket
# 1. 向指定IP发送连接请求
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.10.3', 8001))
# 2. 接收你发的消息
message = client.recv(1024)
print(message.decode("utf-8"))
# 3.断开连接
client.close()
浏览器:充当客户端
服务器:网站
客户端:安装在电脑上的软件。 网易云音乐
服务端:网易服务器
对于程序员来说:
基于django开发的本质就是网站(web应用)
电脑上浏览器本质上是socket实现网络通信。(浏览器本身就已经写好了)
import socket # 1.监听本机的IP和端口 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(('192.168.0.6', 9000)) # 我自己的电脑IP,端口8001 # 2.让多少人等待 sock.listen(5) while True: # 3.等待连接请求的申请,有人来连接(阻塞) -> 登录浏览器来连接我 conn, addr = sock.accept() # 4.收到浏览器发送的消息 buf = conn.recv(2048) print(buf) # 5.给浏览器返回数据 conn.send(b"HTTP/1.1 200 OK\r\n\r\n") conn.send(b"Hello, World") # 6.断开连接 conn.close() # 6.停止服务端程序 sock.close()
知识点:浏览器再与服务端的网站进行通信时,多了几个规则。
服务端:网站
客户端:浏览器
# 请求头首行
GET /xxx/xxx/?name=xxx&age=111 HTTP/1.1\r\n
# 请求头(浏览器等相关信息)
Host: 192.168.0.6:9000\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\r\n\r\n'
# 请求头首行
POST /xxx/xxx/ HTTP/1.1\r\n
# 请求头
Host: 192.168.0.6:9000\r\n
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7\r\n\r\n(\r\n\r\n表示后面为请求体)
# 请求体
username=wupeiqi&password=123
浏览器本质上发送请求时,包含请求头和请求体。
- GET请求
- 只有请求头 + 没有请求体
- 请求头之间用 \r\n
- 请求头和请求体之间用 \r\n\r\n
- POST请求
- 只有请求头 + 有请求体
- 请求头之间用 \r\n
- 请求头和请求体之间用 \r\n\r\n
http协议特点:无状态的短连接。
http的应用:浏览器向服务端发送请求,就是按照http协议来的。
- 请求头+请求体 ;请求头和请求体之间用 \r\n\r\n ;请求头之间用 \r\n
- 一次请求和一次响应后,断开连接。 -> 短连接。 ->无状态如何体现?(朋友B发送 给服务端 服务端知道是朋友B了,说欢迎朋友B 然后连接断开,然后朋友B又连接 服务器更之前一样不知道是谁 所以后面得用cookie来解决)
- 后期记住 请求头+cookie
(具体就是朋友B发送给服务端 服务端知道是朋友B了,并给了一个凭证一起发送回去给朋友B,让朋友B把这个凭证存在浏览器文件,下次朋友B在发送数据给服务器,就会带着这个凭证,服务器收到凭证就知道是朋友B)就是服务器给客户端一个令牌 下次客户端带着令牌来
GET请求和POST的唯一区别就是POST有请求体,用来传输数据。当然,GET也能传输数据,用 get
/xxx/xxx/?name=xxx&age=111
在安装 Django 前,确保系统需要已经安装了 Python 的开发环境。
如果你还没有安装 Python,请先从 Python 官网 下载并安装所需版本的 Python。
Django 安装很简单,使用包管理工具pip安装Django:
# 安装最新版Django
pip install django
# 安装指定版Django4.1
pip install django==4.1
通过以下命令可以查看已安装的版本:
# python 版本
python -V
# Django 版本
python -m django --version
创建一个新的Django项目 mysite2
:
django-admin startproject mysite2
创建完成后项目的目录结构:
.
|-- mysite2
| |-- __init__.py # 一个空文件,告诉 Python 该目录是一个 Python 包
| |-- asgi.py # 一个 ASGI 兼容的 Web 服务器的入口,以便运行你的项目
| |-- settings.py # 该 Django 项目的设置/配置
| |-- urls.py # 该 Django 项目的 URL 声明; 一份由 Django 驱动的网站"目录"
| `-- wsgi.py # 一个 WSGI 兼容的 Web 服务器的入口,以便运行你的项目
`-- manage.py # 一个实用的命令行工具,可让你以各种方式与该 Django 项目进行交互
运行开发服务器
启动Django的开发服务器:
cd myproject
python manage.py runserver
创建Django应用
创建一个新的Django应用:
python manage.py startapp app01
现在整个目录结构如下:
.
|-- mysite2 # 项目的容器
| |-- __init__.py
| |-- __init__.pyc
| |-- settings.py
| |-- settings.pyc
| |-- urls.py # url 配置
| |-- urls.pyc
| |-- views.py # 添加的视图文件
| |-- views.pyc # 编译后的视图文件
| |-- wsgi.py
| `-- wsgi.pyc
`-- manage.py
接着,理解模型、视图、模板等基本概念后,就可以开始实践构建你的项目了。
推荐使用PyCharm创建Django项目
创建Django项目
PyCharm 主页面点击左上角 File -> newProject -> Django
注意:
templates
文件夹,然后在app01
文件夹下新建一个templates
文件夹】mysite2
├── manage.py 【项目的管理,启动项目、创建app、数据管理】【不要动】【***常常用***】
└── mysite
├── __init__.py
├── settings.py 【项目配置】 【***常常修改***】
├── urls.py 【URL和函数的对应关系】【***常常修改***】
├── asgi.py 【接收网络请求】【不要动】
└── wsgi.py 【接收网络请求】【不要动】
创建app
python3.9 manage.py startapp app01
- 项目
- app,用户管理 【表结构、函数、HTML模板、CSS】
- app,订单管理 【表结构、函数、HTML模板、CSS】
- app,后台管理 【表结构、函数、HTML模板、CSS】
- app,网站 【表结构、函数、HTML模板、CSS】
- app,API 【表结构、函数、HTML模板、CSS】
..
注意:一般情况下,用不到多app,这里项目下创建1个app即可。
现在整个目录结构如下:
├── app01 │ ├── __init__.py │ ├── admin.py 【固定,不用动】django默认提供了admin后台管理。 │ ├── apps.py 【固定,不用动】app启动类 │ ├── migrations 【固定,不用动】数据库变更记录 │ │ └── __init__.py │ ├── models.py 【**重要**】,对数据库操作。 │ ├── tests.py 【固定,不用动】单元测试 │ └── views.py 【**重要**】,函数。 ├── manage.py └── mysite2 ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py 【URL->函数】 └── wsgi.py
快速上手
确保app已注册 【settings.py
】
编写URL和视图函数对应关系 【urls.py
】
编写视图函数 【views.py】
启动django项目
python manage.py runserver
接着,理解模型、视图、模板等基本概念后,就可以开始实践构建你的项目了。
path()
可以接收四个参数,分别是两个必选参数:route
、view
和两个可选参数:kwargs
、name
。
# 语法格式:
path(route, view, kwargs=None, name=None)
# 参数
route: 字符串,定义 URL 的路径部分。可以包含变量,例如 <int:my_variable>,以从 URL 中捕获参数并将其传递给视图函数。
view: 视图函数,处理与给定路由匹配的请求。可以是一个函数或一个基于类的视图。
kwargs(可选): 一个字典,包含传递给视图函数的额外关键字参数。
name(可选): 为 URL 路由指定一个唯一的名称,以便在代码的其他地方引用它。这对于在模板中生成 URL 或在代码中进行重定向等操作非常有用。
字段类型
在Django的models.py
文件中,可以使用多种字段来定义模型的属性和表的字段。以下是一些常用的字段类型:
# 字段
CharField:用于存储字符数据,指定max_length参数来设置最大长度。
IntegerField:用于存储整数数据。
FloatField:用于存储浮点数数据。
BooleanField:用于存储布尔值。
DateField:用于存储日期。
DateTimeField:用于存储日期和时间。
TextField:用于存储长文本数据。
EmailField:用于存储电子邮件地址。
URLField:用于存储URL地址。
ForeignKey:用于建立外键关联。
ManyToManyField:用于建立多对多关联。
除了上述字段类型之外,还有其他更多的字段类型可供选择,如FileField、ImageField、UUIDField等。每个字段类型都有一些特定的参数和选项,可以根据需要进行配置。
字段的类型中的属性
在Django的模型中,字段可以使用不同的属性来定义其行为和特性。以下是一些常见的模型字段属性:
# 属性参数 null:指定字段是否允许为NULL值。默认为False,即字段不能为空。 blank:指定字段是否可以为空白。默认为False,即字段不能为空白。 default:指定字段的默认值。可以是一个具体的值或一个可调用对象(如函数)。 choices:指定字段的可选值列表。可以是一个包含元组的列表,每个元组包含两个值:选项的实际值和显示值。 primary_key:指定字段是否为主键。默认情况下,Django会自动为每个模型添加一个自增的主键字段(id),但你也可以将其他字段指定为主键。 unique:指定字段的值是否必须是唯一的。默认为False。 db_index:指定是否为字段创建数据库索引。默认为False。 editable:指定字段是否可编辑。默认为True。如果设置为False,字段将不会出现在模型表单中。 verbose_name:指定字段的人类可读的名称。用于在后台管理界面和表单中显示。 help_text:为字段提供帮助文本,用于在后台管理界面和表单中显示。 auto_now:指定字段在每次保存模型时是否自动更新为当前日期和时间。 auto_now_add:指定字段在模型对象第一次保存时自动设置为当前日期和时间,之后不再更新。 related_name:指定反向关系的名称。用于在关联模型中访问关联对象。 on_delete:指定当关联对象被删除时,该字段的行为。常见的选项包括CASCADE(级联删除关联对象)、PROTECT(阻止删除)、SET_NULL(设置为NULL值)等。 这只是一些常见的模型字段属性,Django还提供了更多的属性和选项,可以根据实际需求选择合适的属性来定义模型字段的行为。
如:在Django的models.CharField
中,除了max_length
字段之外,还有一些其他可选参数可以用来定义CharField
的行为和属性。
以下是models.CharField
中常用的一些字段:
blank:布尔值,指定字段是否可以为空。默认为False,即不能为空。如果设置为True,则允许为空。
null:布尔值,指定字段是否可以为NULL。默认为False,即不允许为NULL。如果设置为True,则允许为NULL。
default:指定字段的默认值。可以是一个具体的值,也可以是一个可调用对象(如函数或方法)。默认值将在创建新对象时使用,如果没有提供其他值。
choices:一个可选的选择列表,用于限制字段的有效值。可以是一个列表或元组的组合,每个元素都是一个包含两个元素的元组,第一个元素是实际存储的值,第二个元素是显示给用户的标签。例如:choices=[('M', 'Male'), ('F', 'Female')]。
verbose_name:字段的人类可读名称。如果未提供,Django将根据字段名称自动生成一个。
help_text:字段的帮助文本,用于提供关于字段用途和输入格式的描述。
validators:一个可选的验证器列表,用于验证字段的值。验证器可以是内置的Django验证器,也可以是自定义的验证器函数。
unique:布尔值,指定字段的值是否必须是唯一的。默认为False,即允许重复值。如果设置为True,则要求字段的值是唯一的。
error_messages:一个字典,用于自定义字段的错误消息。可以定义各种错误消息,如blank(字段为空时的错误消息)、null(字段为NULL时的错误消息)等。
以上是models.CharField
中常用的一些字段。根据具体的需求,可以使用这些字段来定义和配置CharField
的行为和属性。
模型之间的关联关系
在Django中,模型之间可以通过不同类型的关系进行关联。
以下是常见的模型关系类型:
一对一关系(One-to-One Relationship):一个模型实例与另一个模型实例之间有且仅有一个关联关系。例如,一个人只能有一个身份证号,一个身份证号也只能对应一个人。在Django中,可以使用OneToOneField来定义一对一关系。
一对多关系(One-to-Many Relationship):一个模型实例与多个另一个模型实例之间存在关联关系。例如,一个作者可以写多本书,但一本书只能有一个作者。在Django中,可以使用ForeignKey来定义一对多关系。
多对多关系(Many-to-Many Relationship):多个模型实例之间存在多对多关联关系。例如,一个学生可以参加多个课程,一个课程也可以有多个学生。在Django中,可以使用ManyToManyField来定义多对多关系。
多态关系(Polymorphic Relationship):一个模型实例可以同时关联多个不同模型实例。例如,一个评论可以同时关联一篇文章和一个视频。在Django中,可以使用第三方库(如django-polymorphic)来实现多态关系。
自引用关系(Self-Referential Relationship):一个模型实例可以与同一模型的其他实例之间存在关联关系。例如,一个员工可以有一个上级领导,这个上级领导也是一个员工。在Django中,可以使用ForeignKey来定义自引用关系。
以上是常见的模型关系类型,在实际开发中可能还会遇到其他类型的关系。Django提供了丰富的关系字段和管理方法,可以轻松地处理模型之间的关联关系。
model中 class Meta设置
在Django的模型中,class Meta
是一个内部类,用于定义模型的元数据(metadata)。元数据是关于模型的额外信息,用于控制模型的行为和特性。
class Meta
可以包含以下属性:
# class Meta 属性参数 db_table:指定模型在数据库中对应的表名。 ordering:指定模型的默认排序方式。可以是一个包含字段名的列表,也可以是一个字符串。 verbose_name:指定模型的人类可读的名称。用于在后台管理界面显示。 verbose_name_plural:指定模型的复数形式的人类可读名称。 unique_together:指定模型的字段组合必须是唯一的。可以是一个包含字段名的元组或列表。 indexes:指定模型的数据库索引。可以是一个包含models.Index对象的列表。 constraints:指定模型的数据库约束。可以是一个包含models.CheckConstraint、models.UniqueConstraint或models.ForeignKeyConstraint对象的列表。 default_related_name:指定模型的反向关系的默认名称。用于在关联模型中访问关联对象。 abstract:指定模型是否为抽象模型。抽象模型不能直接实例化,只能被其他模型继承。 app_label:指定模型所属的应用程序的名称。 db_tablespace:指定模型在数据库中的表空间。 managed:指定是否由Django自动管理模型的数据库表。默认为True,表示由Django自动创建和维护表结构。
通过定义class Meta,可以对模型进行更精细的控制和配置。这些元数据属性可以影响模型的数据库表结构、后台管理界面的显示、查询结果的排序等。
model中的 def str(self)设置
在Django的模型中,def __str__(self)
是一个特殊的方法,用于定义模型对象的字符串表示形式。该方法在模型对象被打印、显示在后台管理界面或其他上下文中时被调用,用于返回一个可读的字符串表示。
通常情况下,def __str__(self)
方法会返回模型对象的某个字段的值,以便更好地表示该对象。例如,如果模型有一个名为name
的字段,可以在def __str__(self)
方法中返回该字段的值,如下所示:
class MyModel(models.Model):
name = models.CharField(max_length=100)
# other fields...
def __str__(self):
return self.name
在这个例子中,def __str__(self)
方法返回模型对象的name字段的值。当该模型对象被打印或显示时,将以该值作为字符串表示。
通过定义def __str__(self)
方法,可以自定义模型对象的字符串表示形式,以便更好地展示和识别模型对象。这对于调试和开发过程中的可读性非常有用。
Bootstrap
来自 Twitter,是目前最受欢迎的前端框架。
Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的,它简洁灵活,使得 Web 开发更加快捷。
Bootstrap 是由 Twitter 的 Mark Otto 和 Jacob Thornton 开发的。Bootstrap 是 2011 年八月在 GitHub 上发布的开源产品。
在开始使用之前,确保你已具备 HTML 、 CSS 和 JavaScript 的基础知识。
Bootstrap 的特点:
移动设备优先:自 Bootstrap 3 起,框架包含了贯穿于整个库的移动设备优先的样式。
浏览器支持:所有的主流浏览器都支持 Bootstrap。
容易上手:只要您具备 HTML 和 CSS 的基础知识,您就可以开始学习 Bootstrap。
响应式设计:Bootstrap 的响应式 CSS 能够自适应于台式机、平板电脑和手机。
为后端开发人员创建接口提供了一个简洁统一的解决方案。
包含了功能强大的内置组件,易于定制。
还提供了基于 Web 的定制。
Bootstrap是开源的。
Bootstrap 包的内容:
jQuery
是一个 JavaScript 库。
jQuery 极大地简化了 JavaScript 编程。
jQuery 库可以通过一行简单的标记被添加到网页中。
jQuery 是一个轻量级的"写的少,做的多"的 JavaScript 库。
jQuery 库包含以下功能:
AJAX
是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
AJAX 不需要任何浏览器插件,但需要用户允许 JavaScript 在浏览器上执行。
XMLHttpRequest 只是实现 Ajax 的一种方式。
AJAX = 异步 JavaScript 和 XML。
AJAX 是一种用于创建快速动态网页的技术。
通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。
有很多使用 AJAX 的应用程序案例:新浪微博、Google 地图、开心网等等。
AJAX 应用:
AJAX是基于现有的Internet标准,并且联合使用它们
注意,AJAX 与 Flash、Silverlight 和 Java Applet 等 RIA 技术是有区分的,AJAX应用程序与浏览器和平台无关!
AJAX 工作原理:
Django 处理了Web开发中的许多繁琐事务,比如: 用户认证、数据库连接、CRUD(创建、读取、更新、删除)操作、URL路由、表单处理和安全性等,这样开发者就可以专注于编写使网站独特的业务逻辑部分,而不需要重新发明轮子。
Django 遵循“包含电池”的理念,提供了几乎所有开发者可能想要的功能“开箱即用”。
Django 的ORM(对象关系映射)技术使得与数据库的交流变得更加简单,无需编写复杂的SQL语句。Django还强调组件的可重用性,遵循DRY(不要重复自己)的原则。
Django 是一个强大的框架,适合那些希望快速开发安全、可维护的网站的开发者。如果你对创建数据库驱动的网站感兴趣,Django是一个非常有用的框架。
- END -
本文摘编自《速学Django:Web开发从入门到进阶》,经出版方授权发布。
推荐语:
为满足广大Python编程学习者的实际需求,本书作者十多年来致力于推动Python编程基础教学,始终专注于产品原型设计、Django前端开发、Python程序设计。
本书是一本适合Django开发快速入门的图书。
本书配合实际操作的案例,清晰明了地讲解了使用Django进行Web项目开发时所涉及的常用知识点,包括框架配置、路由配置、模型、视图、模板、表单、中间件、上下文处理器、代码测试、网站缓存和网站部署等内容。
摘编图书参考:《速学Django:Web开发从入门到进阶》
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。