一、静态文件:
1、静态文件夹的创建:在项目总目录下手动新建一个static文件夹(非限定名称,约定如此),后续项目需要用到的静态文件都存于该文件夹内,其中可以再划分多个子文件夹来更方便管理这些静态文件。
①js文件夹:存放网页设计时已写好的js文件。
②css文件夹:存放网页设计时已写好的css文件。
③img文件夹:存放网页设计时用的图片文件。
④其他其他第三方框架文件。
2、静态文件的配置:
①settings.py中的<STATIC_URL = '/static/'>:这条是默认配置,此处的'static'并非'static文件夹',是所有静态文件的路由前缀,可修改为其他的,若修改,相应的静态文件的加载路径也需要改变。
②在setting.py中书写上:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'
os.path.join(BASE_DIR, 'static1'
os.path.join(BASE_DIR, 'static2'
]
---②此处的'static'/'static1'/'static2'则是代表静态文件的文件夹了,所以静态文件的文件夹可以有多个,只要加入这项配置后,这些文件夹下面的静态文件都可以通过加上路由前缀'static'被访问到。
3、静态文件的加载路径会随<STATIC_URL = '/static/'>的修改而改变,基于此,Django提供了动态解析方案,需要在html文件的head内书写上如下语句:
{% load static %}
<link rel="stylesheet" href="{% static <css文件的相对url> %}">
<script src="{% static <js文件的相对url> %}"></script>
二、form表单请求数据相关
1、action参数:数据提交处。
①不写,则默认还是跳转当前页面(相当于刷新),并把数据提交给当前页面。
②写全url,定向跳转,并提交数据。
③只写后缀,会补全IP与端口,跳转到同站其他页面,并提交数据。
2、method参数:数据提交的方式。
①不作声明:以默认的'get'方式。
②如改为'post',需要将setting.py中的MIDDLEWARE里面的'django.middleware.csrf.CsrfViewMiddleware'注释掉后,'post'方式才可生效。
三、request对象初认:任何形式访问任一页面都会在页面的视图层生成request对象。
1、request.method:返回请求方式,全大写的字符串形式,可以基于此结果执行不同的代码。
2、request.POST系列:
①request.POST.get():name/value的字典,若value为多值项,只会获得最后一项的value。
②request.POST.getlist():其余与上一条一样,若value为多值项,会获得多值组成的列表。
3、request.GET系列:
①request.GET.get():与'request.POST.get()'的用法基本一致。
②request.GET.getlist():与'request.POST.getlist()'的用法基本一致。
4、request.GET与request.POST相比,前者携带数据的大小有限制,只有几KB,后者没有限制。
四、pycharm连接数据库MySQL
1、三个位置查找呼出按钮:
①两侧快捷框的右上方。
②左下角更多快捷项。
③Settings ===> Plugis里面安装相应插件。
2、连接数据库之前需要先选择合适的驱动,并安装好。
3、用pycharm只能操作已有库,若需新建,还得先通过其他途径创建。
五、Django连接数据库MySQL
1、修改默认配置的sqlite3,将settings.py里面的DATABASES改为:
DATABASES = {
'defaulit' = {
'ENGINE': 'django.db.backends.mysql',
'NAME': '<库名>',
'USER': 'root',
'PASSWORD': '<密码>',
'HOST': '127.0.0.1',
'PORT': 3306,
'CHARSET': 'utf8'
}
}
2、Django默认用的是mysqldb模块连接MySQL,该模块的兼容性不好,需要手动改为pymysql模块,在主文件夹下面或者任意一个app文件夹下面的__init__.py文件中书写上:
import pymysql
pymysql.install_as_MySQLdb()
六、ORM基础
1、简述:ORM即对象关系映射,能够把sql语句通过python的操作对象语法实现来操作数据库。
2、不足:封装程度太高,有时候通过ORM语法执行的效率偏低,此时则还需要用回原生的sql语句。
3、在model.py里面书写类相当于创建了表。
4、对应关系:
①类 <===> 表。
②对象 <===> 一行具体记录。
③对象属性 <===> 具体记录的某个字段的值。
5、表的创建与字段的增改删:无论何种操作,新建表或对表的结构进行了修改,都需要执行下面的数据迁移指令才能生效:
python manage.py makemigrations---将操作记录在数据迁徙文件夹migrations中
python manage.py migrate---将操作真正地同步到数据库
①创建表:
class Student(models.Model): # 必须继承 models.Model # 声明主键,并声明自增 # 若不定义主键,ORM会自定创建一个名为 id 的主键字段 # 基于上一条,当主键无需特定名称时,可省略本条语句 # verbose_name 是对本条字段的描述 id = models.AutoField(primary_key=True, verbose_name='主键') # CharField 相当于 varchar,必须制定长度 student_name = models.CharField(max_length=32, verbose_name='学生姓名') # IntegerField 相当于 int student_age = models.IntegerField(verbose_name='学生年龄')
②增加字段:
# 声明本字段的值可以为 null student_skill = models.CharField(max_length=32, verbose_name='学生特长', null=True) # 声明本字段的默认值为'study' student_hobby = models.CharField(max_length=32, verbose_name='学生爱好', default='study') # 新增字段若既没有声明可以为 null,也没有声明默认值,会在终端进行询问---是否给已有记录统一设置某值或设置为null或另行设置 student_addr = models.CharField(max_length=32, verbose_name='学生地址')
③修改字段:直接修改原语句后执行两句数据迁移指定即可。
④删除字段:直接删除或注释原语句后执行两句数据迁移指定即可,因为如此操作后字段的值也相应被删除了,所有要慎用。
6、记录的查增改删:
①查看记录:
def select_db(request): # filter可以看成是检索条件,后面可以声明多个参数,多个参数之间默认是 and 的关系,括号里面什么都不写,代表查所有数据 # 返回值是数据对象组成的列表,列表可以索引取值,可以切片,不支持负数号索引 student_obj_list = models.Student.objects.filter(student_name='tom') # .first() 相当于 [0] 索引 student_obj_1 = student_obj_list.first() # 拿到具体数据对象,可以查看指定字段的值 print(student_obj_1.student_name) # 查所有数据 student_obj_all_list = models.Student.objects.all()
②增加记录:
def add_db(request): # 本条语句新增记录的同时会返回该数据对象 student_obj_2 = models.Student.objects.create(student_name='pik', student_age=19) print(student_obj_2.student_age)
③增加记录方法二:
def add_db_2(request): # 先生成数据对象,再保存 student_obj_3 = models.Student(student_name='sara', student_age=19) student_obj_3.save() print(student_obj_3.student_hobby)
④修改记录:
def modify_db(request): # 将数据对象列表中所有元素统一修改,也可以用.first()先取出来再修改 student_obj_4 = models.Student.objects.filer(id = 1) student_obj_4.update(student_name = 'bob')
⑤修改记录方法二:
def modify_db_2(request): # 先拿出数据对象,用对象方法修改属性,再保存,也是默认批量,单独拿出才是单个修改 # 该方法会将所有字段,无论是否是修改的字段,都更新一遍 # 所以当字段较多时,效率比较低 student_obj_5 = models.Student.objects.filer(id = 1) student_obj_5.student_name = 'bob' student_obj_5.save()
⑥删除记录:
def delete_db(request): # 跟修改一样,可以批量可以单个 student_obj_6 = models.Student.objects.filer(id = 1) student_obj_6.delete()