[toc]
《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'),)
示例:
xxxxxxxxxx41# file: setting.py2STATICFILES_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.py2from . import views34urlpatterns = [5url(r'^admin/', admin.site.urls),6url(r'^show_', views.show_)7]8# file: views.py9from django.shortcuts import render1011def 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>练习:
xxxxxxxxxx411. 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应用的结构组成
xxxxxxxxxx1411. `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 中配置应用, 让此应用能和整个项目融为一体
xxxxxxxxxx61# file : settings.py2INSTALLED_APPS = [3... ...,4'自定义应用名称'5]6如:
xxxxxxxxxx51INSTALLED_APPS = [2# ....3'user', # 用户信息模块4'music', # 收藏模块5]
应用的分布式路由
- 使用include 函数让某个正则匹配后关联分支到某个app
xxxxxxxxxx211# file : <项目名>/urls.py2from django.conf.urls import include34urlpatterns = [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.py11from django.conf.urls import url12from . import views1314urlpatterns = [15# 购物车模块用到的路由16url(r'^page1', views.page1),17url(r'^page2', views.page2),18url(r'^page3', views.page3),19# ...20]21- 练习:
xxxxxxxxxx1311.创建三个应用21.创建 music 应用,并注册32.创建 sport 应用,并注册43.创建 news 应用,并注册52.创建分布式路由系统6主路由配置只做分发7每个应用中处理具体访问路径和视图81. 127.0.0.1:8000/music/index9交给 music 应用中的 index() 函数处理102. 127.0.0.1:8000/sport/index11交给 sport 应用中的 index() 函数处理123. 127.0.0.1:8000/news/index13交给 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;
xxxxxxxxxx11create database mywebdb default charset utf8 collate utf8_general_ci;- 创建
数据库的配置
- sqlite 数据库配置
xxxxxxxxxx71# file: settings.py2DATABASES = {3'default': {4'ENGINE': 'django.db.backends.sqlite3',5'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),6}7}- mysql 数据库配置
xxxxxxxxxx101DATABASES = {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
- 指定数据库的后端引擎
xxxxxxxxxx41'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引擎的支持
xxxxxxxxxx21import pymysql2pymysql.install_as_MySQLdb()
xxxxxxxxxx11
数据库的迁移
- 迁移是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
xxxxxxxxxx21Object Relationship Mapping2对象 关系 映射三大特征:
- 表 到 类的映射
- 数据类型的映射
- 关系映射
模型示例:
- 此示例为添加一个bookstore_book 数据表来存放图书馆中书目信息
- 添加一个 bookstore 的 app
xxxxxxxxxx11$ python3 manage.py startapp bookstore- 添加模型类并注册app
xxxxxxxxxx121# file : bookstore/models.py2from django.db import models34class Book(models.Model):5title = models.CharField("书名", max_length=50)6price = models.DecimalField('定价', max_digits=7, decimal_places=2)78# file : setting.py9INSTALLED_APPS = [10...11'bookstore',12]- 生成迁移脚本文件
bookstore/migrations/0001_initial.py并进行迁移
xxxxxxxxxx91$ python3 manage.py makemigrations2Migrations for 'bookstore':3bookstore/migrations/0001_initial.py4- Create model Book5$ python3 manage.py migrate6Operations to perform:7Apply all migrations: admin, auth, bookstore, contenttypes, sessions8Running migrations:9Applying bookstore.0001_initial... OK- 查看数据表
xxxxxxxxxx481$ mysql -u root -p2mysql> 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)1617mysql> use mywebdb18Reading table information for completion of table and column names19You can turn off this feature to get a quicker startup with -A2021Database changed22mysql> 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)3940mysql> 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.ModelModels的语法规范
xxxxxxxxxx31from django.db import models2class 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: 小数点后的数字数量
示例:
xxxxxxxxxx41money=models.DecimalField(2max_digits=7,3decimal_places=24)
FloatField()
- 数据库类型:double
- 编程语言中和数据库中都使用小数表示值
EmailField()
- 数据库类型:varchar
- 编程语言和数据库中使用字符串
IntegerField()
- 数据库类型:int
- 编程语言和数据库中使用整数
URLField()
- 数据库类型:varchar(200)
- 编程语言和数据库中使用字符串
ImageField()
数据库类型:varchar(100)
作用:在数据库中为了保存图片的路径
编程语言和数据库中使用字符串
示例:
x
1=models.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个字符,必须是唯一的,不能为空,添加索引
xxxxxxxxxx11 name=models.CharField(max_length=30,unique=True,null=False,db_index=True)文档参见:
- 示例:
xxxxxxxxxx91# file : bookstore/models.py2from django.db import models34class 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)xxxxxxxxxx201# file : bookstore/views.py2from django.http import HttpResponse3from . import models45def 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="机械工业出版社")1516 abook = models.Book(title="HTML5", price=90, market_price=105, pub_date='2019-1-1') # 创建新书17 abook.save() # 保存1819 return HttpResponse("初始化成功")20- 第一次执行视图views.py 中的init_books()函数时结果
xxxxxxxxxx161mysql> 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)- 练习:
xxxxxxxxxx81在 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() 进行保存
xxxxxxxxxx41obj = Entry(属性=值,属性=值)2obj.属性=值3obj.save()4无返回值,保存成功后,obj会被重新赋值使用字典创建对象,并调用save()进行保存
xxxxxxxxxx71dic = {2'属性1':'值',3'属性2':'值2',4}56obj = 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('-列','列')
说明:
- 默认是按照升序排序,降序排序则需要在列前增加'-'表示
xxxxxxxxxx1112Entry.objects.all()3数据类型: <class 'django.db.models.query.QuerySet'>4结果: <QuerySet [<Author: Author object>, <Author: Author object>]>56Entry.objects.values()7<QuerySet 8 [9 {'name': '老舍', 'email': 'laoshe@163.com'}, {'name': '巴金', 'email': 'bajin@163.com'}10 ]11>Django shell 的使用
- 启动 Django shell
xxxxxxxxxx71$ python3 manage.py shell2manage.py shell3Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04)4Type 'copyright', 'credits' or 'license' for more information5IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.67In [1]:
