一、静态文件配置
1.静态文件
在django中,我们将网站所使用的静态文件默认都放在static文件夹下,静态文件就是前段写好的,我们能够直接调用和使用的文件,如网站写好的js文件,css文件,图片文件以及第三方前端框架。
Django默认是不会自动帮你创建static文件夹 需要你自己手动创建,一般情况下我们在static文件夹内还会做进一步的划分处理,如
-static --js --css --img 其他第三方文件
2.静态文件配置
我们在昨天的基础上做了一个网页,然后也写好了css文件和js文件放在了我们的static文件夹下,但是我们在浏览器中输入URL后,结果展示给我们的却只有一个光秃秃的未加css,js修饰的纯html界面,再一看检查会发现放在static文件夹下的css和js文件发生报错403,这就说明后端没有开设该资源的接口,就是因为我们没有配置静态文件,所以我们要配置静态文件。
找到settings文件,拉到最下面会看到
STATIC_URL = '/static/'
这里的STATIC_URL = 'xxx'就是访问静态文件的令牌
我们把要加载的js文件给他配置上
/static/bootstrap-3.3.7-dist/js/bootstrap.min.js
我们再在下面拼接一下静态文件的路径
# 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static'), os.path.join(BASE_DIR,'static1'), os.path.join(BASE_DIR,'static2'), ]
但是我们要想改一下 STATIC_URL = 'xxx'怎么办
我们手改每个地方的路径行不行,不是不行,太傻太慢了
我们可以动态地解释静态文件
{% load static %} <link rel="stylesheet" href="{% static 'bootstrap-3.3.7-dist/css/bootstrap.min.css' %}"> <script src="{% static 'bootstrap-3.3.7-dist/js/bootstrap.min.js' %}"></script>
然后我们随便改static都可以了。
现阶段小tips:
我现在使用django提交post请求的使用,经常会报错,此时对于处于刚学习django阶段的我们还没有,还没有解决这个问题的能力,只需要记住找到配置文件里的中间件,把其中一行注释掉就行了
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', ]
这样就能暂时解决报错问题,在后面对django地深入学习后会回头来解决这个问题的
二、request对象
request.method
返回请求方式 并且是全大写的字符串形式
request.POST
获取用户post请求提交的普通数据不包含文件
print(request.POST) <QueryDict: {'username': ['xilou'], 'password': ['123']}>
request.POST.get:只获取列表最后一个元素
username = request.POST.get('username') print(username,type(username)) hobby = request.POST.get('hobby') print(hobby,type(hobby))
# xilou <class 'str'>
# 333 <class 'str'>
request.POST.getlist:直接将列表取出
username = request.POST.getlist('username') print(username,type(username)) hobby = request.POST.getlist('hobby') print(hobby, type(hobby)) """ ['xilou'] <class 'list'> ['111', '222', '333'] <class 'list'> """
request.GET:
request.GET.get
request.GET.getlist
和POST用法一样,不做赘述,
这里就说一下get和post请求的小区别:
get请求携带的数据是有大小限制的 大概好像只有4KB左右
post请求则没有限制
三、pycharm链接数据库
这里数据库就用mysql来演示
在右上方或者左下方找到database按钮,如果没有就去左下角点这个按钮
找到database,
实在没有就重装pycharm吧
如果是第一次使用那得先装插件,按download然后就会自动下载了
下载完以后点test connection,输入你的mysql账号密码然后再登录就能进去了
四、Django连接数据库
因为Django默认使用的是sqlite3,我们要改成mysql
第一步先找到settings文件中的DATABASE
然后改成
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydjango', 'USER':'root', 'PASSWORD':'你的密码', 'HOST':'127.0.0.1', 'PORT':3306, 'CHARSET':'utf8' } }
这样弄完虽然完成了,但是还不够,我们一运行就会发现问题了
他会报错说:No module named 'pymysql'
由于django默认用的是mysqldb模块链接MySQL
但是该模块的兼容性不好 需要手动改为用pymysql链接
我们要在项目名下的__init__.py或者任意app下的__init__.py中写下以下代码
import pymysql pymysql.install_as_MySQLdb()
五、Django ORM
ORM:对象关系映射
作用:能够让一个不用sql语句的小白也能够通过python 面向对象的代码简单快捷的操作数据库
不足之处:封装程度太高 有时候sql语句的效率偏低 需要你自己写SQL语句
1.先去models.py中书写一个类
class User(models.Model): # id int primary_key auto_increment id = models.AutoField(primary_key=True) # username varchar(32) username = models.CharField(max_length=32) # password int password = models.IntegerField()
2.数据库迁移命令
只要你修改了models.py中跟数据库相关的代码 就必须重新执行下面的两条命令
python3 manage.py makemigrations 将操作记录记录到小本本上(migrations文件夹) python3 manage.py migrate 将操作真正的同步到数据库中
manage.py@d60 > makemigrations bash -cl "/Users/chenfeng/PycharmProjects/d60/venv/bin/python /Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_manage.py makemigrations /Users/chenfeng/PycharmProjects/d60" Tracking file by folder pattern: migrations Migrations for 'app_user': app_user/migrations/0001_initial.py - Create model User Following files were affected /Users/chenfeng/PycharmProjects/d60/app_user/migrations/0001_initial.py Process finished with exit code 0 manage.py@d60 > migrate bash -cl "/Users/chenfeng/PycharmProjects/d60/venv/bin/python /Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm/django_manage.py migrate /Users/chenfeng/PycharmProjects/d60" Tracking file by folder pattern: migrations Operations to perform: Apply all migrations: admin, app_user, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying app_user.0001_initial... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK Process finished with exit code 0
3.对数据库操作的代码对比sql语句
class User(models.Model): # id int primary_key auto_increment id = models.AutoField(primary_key=True,verbose_name='主键') # username varchar(32) username = models.CharField(max_length=32,verbose_name='用户名') """ CharField必须要指定max_length参数 不指定会直接报错 verbose_name该参数是所有字段都有的 就是用来对字段的解释 """ # password int password = models.IntegerField(verbose_name='密码') class Author(models.Model): # 由于一张表中必须要有一个主键字段 并且一般情况下都叫id字段 # 所以orm当你不定义主键字段的时候 orm会自动帮你创建一个名为id主键字段 # 也就意味着 后续我们在创建模型表的时候如果主键字段名没有额外的叫法 那么主键字段可以省略不写 # username varchar(32) username = models.CharField(max_length=32) # password int password = models.IntegerField()
六、ORM中对数据库操作的增删改查
1.字段的增删改查
字段的增加
1.可以在终端内直接给出默认值 2.该字段可以为空 info = models.CharField(max_length=32,verbose_name='个人简介',null=True) 3.直接给字段设置默认值 hobby = models.CharField(max_length=32,verbose_name='兴趣爱好',default='study')
字段的修改
直接修改代码然后执行数据库迁移的两条命令即可!
字段的删
直接注释对应的字段然后执行数据库迁移的两条命令即可!
执行完毕之后字段对应的数据也都没有了
2.数据的增删改查
数据的查询
user_obj = models.User.objects.filter(username=username).first()
返回值你先看成是列表套数据对象的格式
它也支持索引取值 切片操作 但是不支持负数索引
它也不推荐你使用索引的方式取值
数据的增加
第一种:
from app01 import models res = models.User.objects.create(username=username,password=password)
第二种
user_obj = models.User(username=username,password=password) user_obj.save() # 保存数据