..
静态文件
- 静态文件配置-settings.py 中
- 配置静态文件的访问路径【改配置默认存在】
- 通过那个url地址找静态文件
- STATIC_URL = '/static/'
- 说明:
- 指定访问静态文件时是需要通过/static/xxx或http://127.0.0.1:8888/static/xxx[xxx代表具体的静态资源位置]
- 配置静态文件的访问路径【改配置默认存在】
- 配置静态文件的存储路径STATICFILES_DIRS STATICFILES_DIRS 保存的是静态文件在服务器端的存储位置
# file:setting.py
STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static')
)
- 模板中访问静态文件-img标签为例
- 方案2
通过{% static %}标签访问静态文件
1.加载static - {% load static %}
2.使用静态资源-{% static '静态资源路径'%}
3.样例
<img src='{% static 'imgage/xxx.jpg'%}'>
- 小案例
- 先创建新的项目
# 创建一个新的文件夹
mkdir django_03
# 创建新项目
django-admin startproject mysite3
- 运行mysite3
python3 manage.py runserver 8888
- 修改配置
# mysite3 里面的 settings.py
# 1.我们先注释掉csrf ,因为当我们现在发一个怕post请求会触发csrf安全防范,会报403
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
# 2.配置DIRS
'DIRS': [os.path.join(BASE_DIR, 'templates')],
# 3.配置语言版本和时间
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
# 4. 配置STATICFILES_DIRS
STATIC_URL = '/static/'
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'),)
- 创建文件夹
- 创建视图
# views.py
from django.shortcuts import render
def test_static(request):
return render(request, 'test_static.html')
- 创建模板
# test_static.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试静态文件</title>
</head>
<body>
<!-- 绝对地址 -->
<img src="http://127.0.0.1:8888/static/image/django-01.jpg" alt="" width="300px" height="200px">
<!--相对地址-->
<img src="/static/image/django-01.jpg" alt="" width="300px" height="200px">
<!--django写法-->
{% load static %}
<img src="{% static 'image/django-01.jpg' %}" alt="" width="300px" height="200px">
</body>
</html>
- 配置路由
# urls.py
path('test_static', veiws.test_static)
Django 应用及分布式路由
应用
- 应用在Django项目中是一个独立的业务模块,可以包含自己的路由,视图, 模板, 模型
创建应用
- 步骤1
- 用manage.py中的子命令 startapp 创建应用文件夹
python3 manage.py startapp xxxx
- 步骤2
- 在settings.py 的 INSTALLED_APPS 列表中配置安装此应用
# settings.py 配置样例
INSTALLED_APPS = [
#...
'user', # 用户信息模块
'music' # 音乐模块
]
分布式路由
- Djangoa中, 主路由配置文件(urls.py)可以不处理用户具体路由。主路由配置文件的可以做请求的分发(分布式请求处理)。具体的请求可以由各自的应用来进行处理
- 配置分布式路由
- 骤1- 主路由中调用include函数
- 语法:include('app名字.url模块名')
- 作用:用于将当前路由转到各个应用的路由配置文件的urlpatterns进行分布式处理
- 以http://127.0.0.1:8888/music/index为例
- 步骤2-应用下配置urls.py应用下手动创建urls.py文件内容结构同主路由完全一样
- 运行
练习-配置分布式路由
- 创建两个应用
- 创建sport 应用,并且注册
python3 manage.py startapp sport
- 创建news 应用,并注册
python3 manage.py startapp news
- 创建分布式路由系统
- 配置主路由
path('news/', include('news.urls')),
path('sport/', include('sport.urls')),
- http://127.0.0.1:8888/sport/index交给sport应用中的index_view()函数处理
# 在sport文件下面创建urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index_view)
]
- http://127.0.0.1:8888/news/index交给news应用中的index_view()函数处理
# 在news文件下面创建urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index_view)
]
应用下的模板
- 应用内部可以配置模板目录
- 应用下手动创建templates文件夹
- settings.py 中开启应模板功能
TEMOLATE配置项中的'APP_DIRS'值为true即可
- 应用下templates和外层templates都存在时,django得查找模板规则 3.1 优先查找外层templates目录下的模板
3.2 INSTLLED_APP配置下的应用顺序逐层查找
- 以news应用来举例子 1 .创建templates文件夹
2. 在news文件下的views.py中创建视图
def index_view(request):
# return HttpResponse('这是音频页')
return render(request, 'news/index.html')
- 处理外层tempaltes文件夹同名文件出现NSTLLED_APP配置下的应用顺序逐层查找问题
模型层及ORM介绍
模板层-定义
- 模型层-负责跟数据之间进行通信
Django配置mysql
- 创建数据库
- 进去mysql数据库执行
- create database 数据库名 default charset utf8
- 通常数据库名跟项目名保持一致
- settings.py 里进行数据库的配置
- 修改DATABASES配置项的内容, 由sqlite3变为mysql
# 在django项目里面配置mysql
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mysite3',
'USER': 'root',
'PASSWORD': 'aa123456',
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
- ENGINE-指定数据库存储引擎
'django.db.backends.mysql'
'django.db.backends.sqlite3'
'django.db.backends.oracle'
'django.db.backends.postgresql'
- NAME- 指定要连接的数据库的名称
- USER -指定登录到数据库的用户名
- PASSWORD - 数据库的密码
- HOST/PORT - 连接具体数据库的ip 和端口
什么是模型
- 模型是一个python类,他是由django.db.models.Model生出的子类
- 一个模型类代表数据库中的一张数据表
- 模型类中每一个类属性都代表数据库中的一个字段
- 模型是数据交互的接口,是代表和操作数据库的方法和方式
ORM框架
- 定义
- ORM(object Relational Mapping) 即对象关系映射,它是一种程序技术 ,它允许你使用类和对象数据库进行操作,从而避免通过SQL语句操作数据库
- 作用:
- 建立模型类和表之间的对应关系,允许我们通过面向对象的方式来操作数据库
- 根据设计的模型类生成数据库中的表格
- 通过简单的配置就可以进行数据库的切换
- 优点
- 只需要面向对象编程,不需要面向数据库编写代码
- 对数据库的操作都转化成对类属性和方法的操作
- 不用编写各种数据库的sql语句
- 实现了数据模型与数据库的解耦,屏蔽了不同数据库操作上的差异
- 不在关注同的是mysql。 oracle.... 等数据库的内部细节
- 通过简单的配置就可以轻松更换数据库,而不需要修改代码
- 只需要面向对象编程,不需要面向数据库编写代码
- 缺点
- 对于复杂业务,使用成本较高
- 根据对象的操作转换成SQL语句,根据查询的结果传化成对象在映射过程中有性能损失
- 映射图
- 模型示例
- 此示例为添加一个bookstore_book 数据表来存放图书馆书目信息添加一个bookstore的app
- 添加一个bookstore的app
- 添加模型类并注册app
- 此示例为添加一个bookstore_book 数据表来存放图书馆书目信息添加一个bookstore的app
- 数据库迁移
- 迁移是django同步你对模型所做更改(添加字段, 删除模型等) 到你的数据库模式的方式
- 生成迁移文件-执行 python3 manage.py makemigrations 将应用下的models.py 文件生成一个中间文件,并保存在migrations文件夹中
- 迁移是django同步你对模型所做更改(添加字段, 删除模型等) 到你的数据库模式的方式
- 执行迁移脚本程序-执行 Python3 manage.py migrate 执行迁移程序实现迁移,将每个应用下的migrations目录的中间文件同步回数据库
- 模型类 -创建
from django.db import models
class 模型类名(models.Model):
字段名 = models.字段类型(字段选项)
- 移同步 makemigrations & migrate
04-ORM-基础字段及选项1
创建模型类流程
- 任何关于结构的修改,务必在对应模型类上修改
- 例:为bookstore_book表 添加一个名为info 的字段varchar(100)
- 解决方案
- 模型类中添加对应类属性
- 执行数据库迁移
- 解决方案
# 1.在bookstore应用的models.py添加字段
info = models.CharField('描述', max_length=100, default='')
# 2. 数据库迁移(在终端运行)
python3 manage.py makemigrations
Python3 manage.py migrat
- 查看数据库
字段类型
-
BooleanField()
- 数据库类型:tinyint(1)
- 编程语言中:使用true或者False 来表示值
- 在数据库中:使用1或0来表示具体的值
-
CharField()
- 数据库类型:varchar
- 注意:必须要指定max_length 参数值
-
DateField()
-
数据库类型:date
-
作用:表示日期
-
参数:
- 1.auto_now: 每次保存对象时,自动设置该字段为当前时间(取值:True/False)
- 2.auto_now_add: 当对象第一次被创建时自动设置当前时间(取值:True/False)
- 3.default:设置当前时间(取值:字符串格式时间如:'2019-6-1')
-
-
DateTimeField()
- 数据库类型:datetime(6)
- 作用:表示日期和时间
- 参数同DateField
-
FloatFieid()
- 数据库类型:double
- 编程语言中和数据库中都使用小数表示值
-
DecimalField()
-
数据库类型:decimal(x ,y)
-
编程语言中:使用小数表示该列的值
-
在数据库中:使用小数
-
参数:
- max_digits:位数总数,包括小数点后的位数。该值必须大于等于decimal_placse
- decimal_places: 小数点后的数字数量
-
-
EmailField()
- 数据库类型:varchar
- 编程语言和数据库中使用字符串
-
IntegerField()
- 数据库类型:int
- 编程语言和数据库中使用整数
-
ImageField()
- 数据库类型:varchar(100)
- 作用:在数据库中为了保存图片的路径
- 编程语言和数据库中使用字符串
-
TextField()
- 数据库类型:longtext
- 作用:表示不定长的字符数据
创建模型类
-
在bookstore/models.py 应用中添加一个模型类
-
Author- 作者
- name - CharField 姓名 长度最大11
- age - IntergerField 年龄
- email - EmailField 邮箱
# bookstore/models.py
class Author(models.Model):
name = models.CharField('姓名', max_length=11)
age = models.IntegerField('年龄')
email = models.EmailField('邮箱')
# 在终端运行命令迁移文件
python3 manage.py makemigrations
Python3 manage.py migrate
去mysql看看是否多一个表
05-ORM-基础字段及选项2
模型类-字段选项
-
字段选项,指定创建的列的额外的信息
-
允许出现多个字段选项,多个选项之间使用,隔开
-
primary_key
- 如果设置为True,表示该列为主键,如果指定一个字段为主键,则此数据库表不会创建id字段
-
blank
- 设置为true时, 字段可以为空,设置为False时,字段是必须填写的
-
null
- 如果设置为True , 表示该列值允许为空
- 默认为False,如果此选项为False 建议加入default 选项来设置默认值
-
default
- 设置所在列的默认值,如果字段选项null= False 建议添加此项
-
db_index
- 如果设置为true,表示为该列增加索引
-
unique
- 如果设置为True, 表示该字段在数据库中的值必须是唯一(不能重复出现的)
-
db_column
- 指定列的名称,如果不指定的话采用属性名作为列名
-
verbose_name
- 设置此字段在admin界面上的显示名称
字段选项例子
# 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
name = models.CharField(max_length=30, unique=true, null =False, db_index=True)
模型类-Meta类
-
Meta类-定义
- 使用内部Meta类来给模型赋予属性, Meta类下有很多内键的类属性,可对模型做一些控制
- 示例
# bookstore/ models.py
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='')
price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
info = models.CharField('描述', max_length=100, default='')
class Meta:
db_table = 'book'
- 迁移
- 查看数据库
练习修改模型类
-
1。模型类-BOOK 改成book
- title-CharField(50) - 书名(唯一)
- pud - CharField(100) - 出版社 (非空)
- price-DecimalField - 图书定价 总价7/小数点2位
- market_price - 图书零售价 总位7/小数点2位
-
-
模型类-Author (表名 author)
- name - CharField(11) - 姓名(非空)
- age- IntegerField - 年龄 默认值为1
- email - EmailFiel - 邮箱 允许为空
-
-
演示
# models.py
class Book(models.Model):
title = models.CharField('书名', max_length=50, default='', unique=True)
pud = models.CharField('出版社', max_length=100, default='')
price = models.DecimalField('价格', max_digits=7, decimal_places=2, default=0.0)
market_price = models.DecimalField('零售价', max_digits=7, decimal_places=2, default=0.0)
class Meta:
db_table = 'book'
class Author(models.Model):
name = models.CharField('姓名', max_length=11)
age = models.IntegerField('年龄', default=1)
email = models.EmailField('邮箱', null=True)
class Meta:
db_table = 'author'
- 迁移
- 查看mysql
ORM-基本操作-创建数据
ORM-操作
- 基本操作包括增删改查操作,即(CRUD操作)
- CRUD是指在做计算处理时的增加(Create)、 读取查询(Read)、 更新(Update)和删除(Delete)
- ORM CRUD 核心 - -》 模型类。管理器对象
创建数据
-
Django ORM 使用一种直观的方式把数据库表中的数据表示成pyhton对象
-
创建数据中每一条记录就是创建一个数据对象
-
方案一
-
MyModel.objects.cteate(属性1=值1, 属性2 = 值1..)
- 成功:返回创建好的实体对象
- 失败:抛出异常
-
-
方案二
- 创建MyModel 实例对象,并调用save()进行保存
obj = MyModel(属性 =值, 属性= 值)
obj.属性=值
obj.save()
Django Shell
-
在Django 提供了一个交互式的操作项目叫Django Shell 他能够在交互模式用项目工程的代码执行响应的操作
-
利用Django Shell 可以代替编写view的代码来进行直接操作
-
注意:项目代码发生变化时,重新进入Django shell
-
启动方式:
- Python3 manage.py shell
-
练习
- 利用Django shell 给book 表添加如下数据
- 图书信息
创建好后去查看mysql