静态文件

静态文件配置

在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()