《Django 教程》
静态文件
什么是静态文件
- 不能与服务器端做动态交互的文件都是静态文件
- 如:图片,css,js,音频,视频,html文件(部分)
静态文件配置
- 在 settings.py 中配置一下两项内容:
配置静态文件的访问路径
通过哪个url地址找静态文件
STATIC_URL = '/static/'
说明:
- 指定访问静态文件时是需要通过 /static/xxx或 127.0.0.1:8000/static/xxx
- xxx 表示具体的静态资源位置
配置静态文件的存储路径
- 静态文件在服务器端的保存位置
- STATICFILES_DIRS=(os.path.join(BASE_DIR,'static'),)
示例:
xxxxxxxxxx
41# file: setting.py
2STATICFILES_DIRS = [
3os.path.join(BASE_DIR, "static")
4]
访问静态文件
使用静态文件的访问路径进行访问
访问路径: STATIC_URL=/static/
示例:
x
1<img src="/static/s/lena.jpg">
2<img src="http://127.0.0.1:8000/static/s/lena.jpg">
通过 {% static %}标签访问静态文件 {% static %}表示的就是静态文件访问路径
- 加载 static
{% load static %}
- 使用静态资源时
语法:{% static '静态资源路径' %}
<img src="{% static 'images/lena.jpg' %}">
- 加载 static
示例:
x
1# file: url.py
2from . import views
3
4urlpatterns = [
5url(r'^admin/', admin.site.urls),
6url(r'^show_', views.show_ )
7]
8# file: views.py
9from django.shortcuts import render
10
11def show_ (request):
12return render(request, "show_.html")
x
1<html>
2<head></head>
3<body>
4<h1>this is lena!</h1>
5<img src="/static/s/lena.jpg">
6<h1>this is templates lena!</h1>
7{% load static %}
8<img src="{% static 's/lena.jpg' %}">
9</body>
10</html>
练习:
xxxxxxxxxx
411. 127.0.0.1:8000 : 显示首页效果
22. 127.0.0.1:8000/login : 显示登录页
33. 127.0.0.1:8000/cart : 显示购物车页
4处理好所有的静态文件
Django中的应用 – app
什么是应用(app)
- 应用在Django项目中是一个独立的业务模块,可以包含自己的路由,视图,… …
- Django中,主文件夹是不处理用户具体请求的.主文件夹的作用是做项目的初始化以及请求的分发(分布式请求处理).具体的请求是由应用来进行处理的
创建应用app
创建应用的指令
python3 manage.py startapp 应用名称
如:
- python3 manage.py startapp music
Django应用的结构组成
xxxxxxxxxx
1411. `migrations` 文件夹
2 - 保存数据迁移的中间文件
32. `__init__.py`
4 - 应用子包的初始化文件
53. `admin.py`
6 - 应用的后台管理配置文件
74. `apps.py`
8 - 应用的属性配置文件
95. `models.py`
10 - 与数据库相关的模型映射类文件
116. `tests.py`
12 - 应用的单元测试文件
137. `views.py`
14 - 定义视图处理函数的文件
配置安装应用
在 settings.py 中配置应用, 让此应用能和整个项目融为一体
xxxxxxxxxx
61# file : settings.py
2INSTALLED_APPS = [
3... ...,
4'自定义应用名称'
5]
6
如:
xxxxxxxxxx
51INSTALLED_APPS = [
2# ....
3'user', # 用户信息模块
4'music', # 收藏模块
5]
应用的分布式路由
- 使用include 函数让某个正则匹配后关联分支到某个app
xxxxxxxxxx
211# file : <项目名>/urls.py
2from django.conf.urls import include
3
4urlpatterns = [
5url(r'^admin/', admin.site.urls),
6url(r'^music/', include('music.urls')),
7url(r'^sport/',include('sport.urls')),
8url(r'^news/',include('news.urls')),
9]
10# file : <App名>/urls.py
11from django.conf.urls import url
12from . import views
13
14urlpatterns = [
15# 购物车模块用到的路由
16url(r'^page1', views.page1),
17url(r'^page2', views.page2),
18url(r'^page3', views.page3),
19# ...
20]
21
- 练习:
xxxxxxxxxx
1311.创建三个应用
21.创建 music 应用,并注册
32.创建 sport 应用,并注册
43.创建 news 应用,并注册
52.创建分布式路由系统
6主路由配置只做分发
7每个应用中处理具体访问路径和视图
81. 127.0.0.1:8000/music/index
9交给 music 应用中的 index() 函数处理
102. 127.0.0.1:8000/sport/index
11交给 sport 应用中的 index() 函数处理
123. 127.0.0.1:8000/news/index
13交给 news 应用中的 index() 处理处理
数据库 和 模型
Django下使用mysql数据库
安装 pymysql包
用作 python 和 mysql 的接口
$ sudo pip3 install pymysql
安装 mysql 客户端(非必须)
$ sudo pip3 install mysqlclient
创建 和 配置数据库
创建数据库
- 创建
create database 数据库名 default charset utf8 collate utf8_general_ci;
xxxxxxxxxx
11create database mywebdb default charset utf8 collate utf8_general_ci;
- 创建
数据库的配置
- sqlite 数据库配置
xxxxxxxxxx
71# file: settings.py
2DATABASES = {
3'default': {
4'ENGINE': 'django.db.backends.sqlite3',
5'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
6}
7}
- mysql 数据库配置
xxxxxxxxxx
101DATABASES = {
2'default' : {
3'ENGINE': 'django.db.backends.mysql',
4'NAME': 'mywebdb', # 数据库名称,需要自己定义
5'USER': 'root',
6'PASSWORD': '123456', # 管理员密码
7'HOST': '127.0.0.1',
8'PORT': 3306,
9}
10}
关于数据为的SETTING设置
ENGINE
- 指定数据库的后端引擎
xxxxxxxxxx
41'django.db.backends.mysql'
2'django.db.backends.sqlite3'
3'django.db.backends.oracle'
4'django.db.backends.postgresql'
mysql引擎如下:
- 'django.db.backends.mysql'
NAME
- 指定要连接的数据库的名称
'NAME': 'mywebdb'
USER
- 指定登录到数据库的用户名
'USER':'root'
PASSWORD
- 接数据库时使用的密码。
'PASSWORD':'123456'
HOST
- 连接数据库时使用哪个主机。
'HOST':'127.0.0.1'
PORT
- 连接数据库时使用的端口。
'PORT':'3306'
添加 mysql 支持
安装pymysql 模块
$ sudo pip install pymysql
修改项目中init.py 加入如下内容来提供pymysql引擎的支持
xxxxxxxxxx
21import pymysql
2pymysql.install_as_MySQLdb()
xxxxxxxxxx
11
数据库的迁移
- 迁移是Django同步您对模型所做更改(添加字段,删除模型等) 到您的数据库模式的方式
生成或更新迁移文件
- 将每个应用下的models.py文件生成一个中间文件,并保存在migrations文件夹中
python3 manage.py makemigrations
执行迁移脚本程序
- 执行迁移程序实现迁移。将每个应用下的migrations目录中的中间文件同步回数据库
python3 manage.py migrate
查看迁移执行的SQL语句
- 将 sqlmigrate, 显示迁移的sql语句
python3 manage.py sqlmigrate
模型(Models)
模型是提供数据信息的数据库接口。
模型是数据的唯一的、确定的信息源。 它包含你所储存数据的必要字段和行为。
通常,每个模型对应数据库中唯一的一张表。每个模型的实例对应数据表中的一条记录
模型说明:
- 每个模型都是一个Python类,每个模型都是django.db.models.Model的子类。
- 每一个模型属性都代表数据库中的一个表。
- 通过所有这一切,Django为你提供一个自动生成的数据库访问API;
Python 数据库模型 – Models
ORM框架
ORM(Object Relationship Mapping)即对象关系映射,它允许你使用类和对象对数据库进行交互(使用类和对象和使用 SQL一样且更方便各种操作)。
ORM
xxxxxxxxxx
21Object Relationship Mapping
2对象 关系 映射
三大特征:
- 表 到 类的映射
- 数据类型的映射
- 关系映射
模型示例:
- 此示例为添加一个bookstore_book 数据表来存放图书馆中书目信息
- 添加一个 bookstore 的 app
xxxxxxxxxx
11$ python3 manage.py startapp bookstore
- 添加模型类并注册app
xxxxxxxxxx
121# file : bookstore/models.py
2from django.db import models
3
4class Book(models.Model):
5title = models.CharField("书名", max_length=50)
6price = models.DecimalField('定价', max_digits=7, decimal_places=2)
7
8# file : setting.py
9INSTALLED_APPS = [
10...
11'bookstore',
12]
- 生成迁移脚本文件
bookstore/migrations/0001_initial.py
并进行迁移
xxxxxxxxxx
91$ python3 manage.py makemigrations
2Migrations for 'bookstore':
3bookstore/migrations/0001_initial.py
4- Create model Book
5$ python3 manage.py migrate
6Operations to perform:
7Apply all migrations: admin, auth, bookstore, contenttypes, sessions
8Running migrations:
9Applying bookstore.0001_initial... OK
- 查看数据表
xxxxxxxxxx
481$ mysql -u root -p
2mysql> show databases;
3+--------------------+
4| Database |
5+--------------------+
6| information_schema |
7| mygoods |
8| mysql |
9| mywebdb |
10| onlybuyp |
11| performance_schema |
12| sys |
13| test_db |
14+--------------------+
158 rows in set (0.00 sec)
16
17mysql> use mywebdb
18Reading table information for completion of table and column names
19You can turn off this feature to get a quicker startup with -A
20
21Database changed
22mysql> show tables;
23+----------------------------+
24| Tables_in_mywebdb |
25+----------------------------+
26| auth_group |
27| auth_group_permissions |
28| auth_permission |
29| auth_user |
30| auth_user_groups |
31| auth_user_user_permissions |
32| bookstore_book | <<== 新加表
33| django_admin_log |
34| django_content_type |
35| django_migrations |
36| django_session |
37+----------------------------+
3811 rows in set (0.00 sec)
39
40mysql> desc bookstore_book;
41+-------+--------------+------+-----+---------+----------------+
42| Field | Type | Null | Key | Default | Extra |
43+-------+--------------+------+-----+---------+----------------+
44| id | int(11) | NO | PRI | NULL | auto_increment |
45| title | varchar(50) | NO | | NULL | |
46| price | decimal(7,2) | NO | | NULL | |
47+-------+--------------+------+-----+---------+----------------+
483 rows in set (0.00 sec)
表bookstore_book 即为模型 Book 类对应的数据表
- id 为主键,当设定主键时会自动添加id字段为主键
- 如果更新模型类 models.py 中的内容时需要运行 makemigrations 和 migrate 子命名来更新和同步数据库
- 在开发阶段如果同步数据库出错。用
sql> drop database 数据库名
删除数据库后重新迁移数据库 - 在 xxx_app/migrations/*.py 下的文件是自动生成的迁移脚本文件,可以手动删除且在下一次迁移时自动生成
编写模型类Models
模型类需继承
自django.db.models.Model
Models的语法规范
xxxxxxxxxx
31from django.db import models
2class CLASSNAME类名(models.Model):
3NAME=models.FIELD_TYPE(FIELD_OPTIONS)
CLASSNAME
实体类名,表名组成一部分,建议类名首字母大写
默认表名组成规范:
- 应用名称_classname
NAME
- 属性名,映射回数据库就是字段名
FIELD_TYPE
- 字段类型:映射到表中的字段的类型
FIELD_TYPE 类型及含义
BooleanField()
- 数据库类型:tinyint(1)
- 编程语言中:使用True或False来表示值
- 在数据库中:使用1或0来表示具体的值
CharField()
数据库类型:varchar
注意:
- 必须要指定max_length参数值
DateField()
数据库类型:date
作用:表示日期
编程语言中:使用字符串来表示具体值
参数:
- DateField.auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)。
- DateField.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)。
- DateField.default: 设置当前时间(取值:字符串格式时间如: '2019-6-1')。
- 以上三个参数只能多选一
DateTimeField()
- 数据库类型:datetime(6)
- 作用:表示日期和时间
- auto_now_add=True
DecimalField()
数据库类型:decimal(x,y)
编程语言中:使用小数表示该列的值
在数据库中:使用小数
参数:
- DecimalField.max_digits: 位数总数,包括小数点后的位数。 该值必须大于等于decimal_places.
- DecimalField.decimal_places: 小数点后的数字数量
示例:
xxxxxxxxxx
41money=models.DecimalField(
2max_digits=7,
3decimal_places=2
4)
FloatField()
- 数据库类型:double
- 编程语言中和数据库中都使用小数表示值
EmailField()
- 数据库类型:varchar
- 编程语言和数据库中使用字符串
IntegerField()
- 数据库类型:int
- 编程语言和数据库中使用整数
URLField()
- 数据库类型:varchar(200)
- 编程语言和数据库中使用字符串
ImageField()
数据库类型:varchar(100)
作用:在数据库中为了保存图片的路径
编程语言和数据库中使用字符串
示例:
x
1models.Field( =
2upload_to="static/s"
3)
upload_to:指定图片的上传路径 在后台上传时会自动的将文件保存在指定的目录下
TextField()
- 数据库类型:longtext
- 作用:表示不定长的字符数据
字段选项
FIELD_OPTIONS
- 字段选项,指定创建的列的额外的信息
- 允许出现多个字段选项,多个选项之间使用,隔开
primary_key
- 如果设置为True,表示该列为主键
null
- 如果设置为True,表示该列值允许为空
- 默认为False
default
- 设置所在列的默认值
db_index
- 如果设置为True,表示为该列增加索引
unique
- 如果设置为True,表示该列的值唯一
db_column
- 指定列的名称,如果不指定的话则采用属性名作为列名
- ex: 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
xxxxxxxxxx
11 name=models.CharField(max_length=30,unique=True,null=False,db_index=True)
文档参见:
- 示例:
xxxxxxxxxx
91# file : bookstore/models.py
2from django.db import models
3
4class Book(models.Model):
5 title = models.CharField("书名", max_length=50)
6 price = models.DecimalField('定价', max_digits=7, decimal_places=2)
7 pub_house = models.CharField("出版社", max_length=50, default='清华大学出版社')
8 pub_date = models.DateField('出版时间', default='1970-1-1')
9 market_price = models.DecimalField('市价', max_digits=7, decimal_places=2, default=9999)
xxxxxxxxxx
201# file : bookstore/views.py
2from django.http import HttpResponse
3from . import models
4
5def init_books(request):
6 models.Book.objects.create(title='C', price=30, market_price=35, pub_house="清华大学出版社")
7 models.Book.objects.create(title='C++', price=40, market_price=45, pub_house="清华大学出版社")
8 models.Book.objects.create(title='Java', price=50, market_price=55, pub_house="清华大学出版社")
9 models.Book.objects.create(title='Python', price=20, market_price=25, pub_house="清华大学出版社")
10 models.Book.objects.create(title='Python3', price=60, market_price=65, pub_house="清华大学出版社")
11 models.Book.objects.create(title='Django', price=70, market_price=75, pub_house="清华大学出版社")
12 models.Book.objects.create(title='JQuery', price=90, market_price=85, pub_house="机械工业出版社")
13 models.Book.objects.create(title='Linux', price=80, market_price=65, pub_house="机械工业出版社")
14 models.Book.objects.create(title='Windows', price=50, market_price=35, pub_house="机械工业出版社")
15
16 abook = models.Book(title="HTML5", price=90, market_price=105, pub_date='2019-1-1') # 创建新书
17 abook.save() # 保存
18
19 return HttpResponse("初始化成功")
20
- 第一次执行视图views.py 中的init_books()函数时结果
xxxxxxxxxx
161mysql> select * from bookstore_book;
2+----+---------+-------+--------------+------------+----------------+
3| id | title | price | market_price | pub_date | pub_house |
4+----+---------+-------+--------------+------------+----------------+
5| 1 | C | 30.00 | 35.00 | 1970-01-01 | 清华大学出版社 |
6| 2 | C++ | 40.00 | 45.00 | 1970-01-01 | 清华大学出版社 |
7| 3 | Java | 50.00 | 55.00 | 1970-01-01 | 清华大学出版社 |
8| 4 | Python | 20.00 | 25.00 | 1970-01-01 | 清华大学出版社 |
9| 5 | Python3 | 60.00 | 65.00 | 1970-01-01 | 清华大学出版社 |
10| 6 | Django | 70.00 | 75.00 | 1970-01-01 | 清华大学出版社 |
11| 7 | JQuery | 90.00 | 85.00 | 1970-01-01 | 机械工业出版社 |
12| 8 | Linux | 80.00 | 65.00 | 1970-01-01 | 机械工业出版社 |
13| 9 | Windows | 50.00 | 35.00 | 1970-01-01 | 机械工业出版社 |
14| 10 | HTML5 | 90.00 | 105.00 | 2019-01-01 | 清华大学出版社 |
15+----+---------+-------+--------------+------------+----------------+
1610 rows in set (0.00 sec)
- 练习:
xxxxxxxxxx
81在 bookstore 应用中添加两个model类
21. Author - 作者
31.name - 姓名,非空,唯一,加索引
42.age - 年龄,非空
53.email - 邮箱,允许为空
62. Book - 图书
71.title - 书名,非空,唯一,加索引
82.publicate_date - 出版时间,非空,加索引
<!–
相关指令
通过数据库自动导出models
python3 manage.py inspectdb > xxx.py
–>
数据库的操作(CRUD操作)
CRUD是指在做计算处理时的增加(Create)、读取查询(Read)、更新(Update)和删除(Delete)
数据换的增册改查可以通过模型的管理器实现
- MyModel.objects 是管理器对象
创建数据对象
Django 使用一种直观的方式把数据库表中的数据表示成Python 对象
创建数据中每一条记录就是创建一个数据对象
Entry.objects.create(属性=值, 属性=值)
- 返回值: 返回创建好的实体对象
创建Entry对象,并调用 save() 进行保存
xxxxxxxxxx
41obj = Entry(属性=值,属性=值)
2obj.属性=值
3obj.save()
4无返回值,保存成功后,obj会被重新赋值
使用字典创建对象,并调用save()进行保存
xxxxxxxxxx
71dic = {
2'属性1':'值',
3'属性2':'值2',
4}
5
6obj = Entry(**dic)
7obj.save()
练习:
- 使用以上三种方式,分别向Book和Publisher表中各增加三条数据
查询数据
通过 Entry.objects 管理器方法调用查询接口
方法 说明 all() 查询全部记录 get() 查询符合条件的单一记录 filter() 查询符合条件的多条记录 exclude() 查询符合条件之外的全部记录 …
all()方法
方法: all()
用法: Entry.objects.all()
作用: 查询Entry实体中所有的数据
- select * from tabel
返回值: QuerySet对象
查询返回指定列
方法: values('列1', '列2')
用法: Entry.objects.values(…)
作用: 查询部分列的数据并返回
- select 列1,列2 from xxx
返回值: QuerySet
- 会将查询出来的数据封装到字典中,再封装到查询集合QuerySet中
查询返回指定列
方法:values_list('列1','列2')
用法:Entry.objects.values_list(…)
返回值:QuerySet
- 会将查询出来的数据封装到元组中,再封装到查询集合QuerySet中
排序查询
方法:order_by
用法:Entry.objects.order_by('-列','列')
说明:
- 默认是按照升序排序,降序排序则需要在列前增加'-'表示
xxxxxxxxxx
111
2Entry.objects.all()
3数据类型: <class 'django.db.models.query.QuerySet'>
4结果: <QuerySet [<Author: Author object>, <Author: Author object>]>
5
6Entry.objects.values()
7<QuerySet
8 [
9 {'name': '老舍', 'email': 'laoshe@163.com'}, {'name': '巴金', 'email': 'bajin@163.com'}
10 ]
11>
Django shell 的使用
- 启动 Django shell
xxxxxxxxxx
71$ python3 manage.py shell
2manage.py shell
3Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)
4Type 'copyright', 'credits' or 'license' for more information
5IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
6
7In [1]: