静态文件
静态文件配置
在setting.py中,配置项:(默认)
STATIC_URL = '/static/'
说明指定的静态文件需要通过/static/xxx
或127.0.0.1:8000/static/xxx 找到
手动添加!!!
静态文件的存储路径STATICFILES_DIRS
静态文件在服务器端的存储位置
STATICFILES_DIRS = (os.path.join(BASE_DIR,'static'),)
模板中:
1.加载static --- {% load static %}
2.使用静态资源 --- {% static '静态资源路径' %}
[此时路径直接写static下的路径,不带static]
应用
应用在Django项目中是一个独立的业务模块
1.创建应用
python(python3) manage.py startapp xxx
2.配置
在settings.py的INSTALLED_APPS列表中配置安装此应用
INSTALLED_APPS = [
# ...
'user', # 用户信息模块
'music', # 音乐模块
]
项目模块:
migratons文件夹 ---- 跟数据相关
admin.py ---- 跟管理后台相关
apps.py ---- 应用相关配置
models.py ---- 模型层相关
test.py ---- 测试入口
views.py ---- 视图函数
分布式路由
有主路由和各个应用
在Django中,主路由配置文件urls.py可以不出来用户具体路由,所以可以在各个应用下创建子路由urls.py
配置分布式路由:
1.主路由中调用include函数;(主路由调用子路由)
语法:include('app名字.url模板名')
# 以http://127.0.0.1:8000/music/index 为例
例:path('music/',include('music.urls'))
2.应用下配置urls.py
内容结构跟主路由一样
urlpatterns = [
path('index',views.index_view)
]
应用下的模块
1.应用下手动创建templates文件夹
2.settings.py中开启 应用模块功能
TEMPLATES 配置下 'APP_DIRS': True
【如果外层有同名的html文件,会先找外层html】
【如果不用应用有同名html文件,会找settings.py中最先建立的模块】
解决方法:
在应用文件夹下的templates文件夹下创建一个与应用同名的文件夹,在创建html文件
此时视图views.py得换路径去重写
模型层
与数据库建立联系 (调用的mysqlclient库来连接数据库)
1.创建数据库:
create database 数据库名 default charset utf8
【数据库名一般跟项目名一样】
2.配置数据库
DATABASES = {
'default': {
# 引擎(引擎还有很多,不同引擎有不同配置)
'ENGINE': 'django.db.backends.mysql',
# 数据库名
'NAME': 'pytest2',
'USER': 'ROOT',
'PASSWORD': "密码",
'HOST': '127.0.0.1',
'PORT': '3306'
}
}
模型(通过ORM实现)
模型是python的一个类,必须由django.db.models.Model派生出来的子类
@ 一个模型代表数据库的一张表
@ 模型中每一个类属性代表数据库的一个字段
@ 模型是数据交互的接口,是表示和操作数据库的方法和方式
ORM框架
使用类和对象进行对数据库操作,避免通过SQL语句操作数据库
1.创建应用并添加进settings.py
2.在应用下的models创建类
from django.db import models
class 模型名(models.Model):
字段名 = models.字段类型(字段选项(属性))
3.models的模型类同步到数据库(数据库迁移)
生成迁移文件
python(python3) manage.py makemigrations
执行迁移文件脚本
python(python3) manage.py migrate
字段类型
django 数据库
BooleanField() tinyint(1) # python中是True或False而数据库是1或0
CharField() varchar # 必须指定max_length
DateField() date # 参数:auto_now(每次保存时的当前时间);auto_now_add(创建时的时间);default(给出默认值),三选一
DateTimeField() datetime(6) # 同DateField相同
FloatField() double # 浮点数
DecimalField() decimal(x,y) # 小数,参数:需给出max_digits(位数总数);decimal_places(小数位数)
EmailField() varchar # 只存email(在运行时存在正则的检测)
IntegerField() int
ImageField() varchar # 在数据库中为了保存图片路径
TextField() longtext # 存不定长字符数据
字段选项(值为boolean型)
primary_key 主键
blank 字段是否可以为空(True为可以为空)
null 该列值允许为空
default 设置所在列的默认值(如果字段选项null=False建议添加default)
db_index 设置为True时,表示改列增加索引
unique 唯一(不能重复)
db_column 指定列的名称
verbose_name 设置此字段在admin界面上的显示名称
模型类---Meta类
控制表的相关属性(在类里面定义Mate类)
例:
from django.db import models
class Book(models.Model):
title = models.CharField(...)
...
class Meta:
db_table = 'book' # 可以改变模型类对应的表名(数据库中)
【添加字段时一定要加default,django默认是允许为空的!!!】
【数据库表django_migrations记录了每次迁移文件记录!!!】
【一般在提交项目时,不提交migrations里的文件】
常见问题:
1.数据库迁移文件混乱(数据库中表django_migrations记录了migrate的全过程,
项目各应用中的migrate文件应与之对应,否则会报错)
解决办法:
1.删除所有migrations里所有000?_xxxx.py(除__init__.py)
2.删除数据库(sql> drop database 数据库)
3.重新创建数据库
4.重新生成迁移文件
5.重新同步进数据库
创建数据
通过模型类里的管理器对象实现
[每个继承models.Model的模型类,都有一个objects对象被继承,这个对象就是管理器]
例:
class MyModel(models.Model):
...
MyModel.objects.create(属性=值,....)
实现方案1:
直接用objects.create(属性=值,...)
实现方案2:
创建MyModel实例对象,调用save()进行保存
obj = MyModel(属性=值,...) 或 obj = MyModel()
obj.属性 = 值
obj.save()
【可以利用Django Shell 去编写view的代码,它是以整个项目为基础】
项目代码发生变化时,需要重新进入
启动:python(python3) manage.py shell
例【方案1】:
>>> from bookstore.models import Book
>>> b1 = Book.objects.create(title='python',pub='清华大学',price=20,market_price=25)
【方案2】:
>>> b2 = Book(title='Django',pub='清华大学',price=70,market_price=75)
>>> b2.save()